Java中final和static关键字在多线程环境下的具体应用和区别是什么?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1115个文字,预计阅读时间需要5分钟。
这篇文章主要介绍了Java中的多线程关键字final和static的用法。通过示例代码,我们将详细讲解这两个关键字,对学习者和工作者具有一定的参考价值。
1. final关键字
final关键字用于声明一个常量,其值在初始化后不能被修改。final关键字可以用于变量、方法和类。
- 变量:声明为final的变量必须在初始化时赋值,之后不能修改。
javapublic class FinalExample { public static void main(String[] args) { final int a=10; // a=20; // 编译错误,final变量a的值不能被修改 }}
- 方法:声明为final的方法不能被子类重写。
javapublic class FinalMethodExample { public final void display() { System.out.println(This is a final method.); }}
public class SubClass extends FinalMethodExample { // 编译错误,不能重写final方法 // @Override // public void display() { // System.out.println(This is a subclass final method.); // }}
- 类:声明为final的类不能被继承。
javapublic final class FinalClassExample { // 类体}
2. static关键字
static关键字用于声明一个静态成员,它属于类本身,而不是类的实例。静态成员可以在类加载时就初始化,并且所有实例都可以共享。
- 静态变量:静态变量在类加载时初始化,并且所有实例共享。
javapublic class StaticExample { public static int count=0;
public StaticExample() { count++; }
public static void main(String[] args) { StaticExample obj1=new StaticExample(); StaticExample obj2=new StaticExample(); System.out.println(Count: + count); // 输出:Count: 2 }}
- 静态方法:静态方法可以直接通过类名调用,而不需要创建类的实例。
javapublic class StaticMethodExample { public static void display() { System.out.println(This is a static method.); }
public static void main(String[] args) { StaticMethodExample.display(); // 输出:This is a static method. }}
- 静态初始化块:用于在类加载时执行初始化代码。
javapublic class StaticBlockExample { static { System.out.println(Static block is executed.); }
public static void main(String[] args) { System.out.println(Main method is executed.); }}
总结:final和static关键字在Java编程中非常有用,它们可以增强代码的可读性和可维护性。对于学习者和工作者来说,掌握这两个关键字对于提高编程能力具有重要意义。需要的朋友可以参考以上内容。
这篇文章主要介绍了java多线程关键字final和static详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
final关键字
1.final关键字在单线程中的特点:
1)final修饰的静态成员:必须在进行显示初始化或静态代码块赋值,并且仅能赋值一次。
2)final修饰的类成员变量,可以在三个地方进行赋值:显示初始化、构造代码块和构造方法,并且仅能赋值一次。
3)final修饰的局部变量,必须在使用之前进行显示初始化(并不一定要在定义是赋值),仅能赋值一次。
总之,final修饰的静态成员必须在类加载完之前进行赋值,final修饰的成员变量,必须在对象创建完之前进行赋值。
补充:final修饰的基本数据类型不能被重新赋值,final修饰的引用数据类型,引用类型的地址不能改变,引用类型的内部属性可以改变。
2. final在多线程的作用
由于重排序的作用,一个线程读取到一个对象的引用时,该对象可能尚未初始化完毕,即这些线程可能读取到该对象字段的默认值而不是初始值。
final关键字具有特殊的作用:当一个对象发布到其他线程的时候,该对象的所有final字段都是初始化完成的,即其他线程读取到的都是相应字段的初始值而不是默认值。而非final字段就没有这种保障。
对于final修饰的引用类型的字段,该字段还能保障该字段所引用的对象 初始化完毕。
这种机制是通过禁止重排序实现的:
对于final变量的写:禁止final域的写重排序到构造方法之外,即得到一个对象的引用时,其内部的final域必定已被初始化完毕。
对于final域的读:禁止初次读该对象的引用与读该对象包含的final域进行重排序。
这两种重排序都是底层是通过内存屏障实现的,编译器会在final域写之后,构造函数执行完之前插入一个storestore屏障,在读final域之前插入一个loadload屏障。
static关键字
static关键字能够保证一个线程即使在未使用其他线程同步机制的情况下也总是可以读到一个类静态变量的初始值,但这种可见性的保障仅限于 初次读取该变量
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易盾网络。
本文共计1115个文字,预计阅读时间需要5分钟。
这篇文章主要介绍了Java中的多线程关键字final和static的用法。通过示例代码,我们将详细讲解这两个关键字,对学习者和工作者具有一定的参考价值。
1. final关键字
final关键字用于声明一个常量,其值在初始化后不能被修改。final关键字可以用于变量、方法和类。
- 变量:声明为final的变量必须在初始化时赋值,之后不能修改。
javapublic class FinalExample { public static void main(String[] args) { final int a=10; // a=20; // 编译错误,final变量a的值不能被修改 }}
- 方法:声明为final的方法不能被子类重写。
javapublic class FinalMethodExample { public final void display() { System.out.println(This is a final method.); }}
public class SubClass extends FinalMethodExample { // 编译错误,不能重写final方法 // @Override // public void display() { // System.out.println(This is a subclass final method.); // }}
- 类:声明为final的类不能被继承。
javapublic final class FinalClassExample { // 类体}
2. static关键字
static关键字用于声明一个静态成员,它属于类本身,而不是类的实例。静态成员可以在类加载时就初始化,并且所有实例都可以共享。
- 静态变量:静态变量在类加载时初始化,并且所有实例共享。
javapublic class StaticExample { public static int count=0;
public StaticExample() { count++; }
public static void main(String[] args) { StaticExample obj1=new StaticExample(); StaticExample obj2=new StaticExample(); System.out.println(Count: + count); // 输出:Count: 2 }}
- 静态方法:静态方法可以直接通过类名调用,而不需要创建类的实例。
javapublic class StaticMethodExample { public static void display() { System.out.println(This is a static method.); }
public static void main(String[] args) { StaticMethodExample.display(); // 输出:This is a static method. }}
- 静态初始化块:用于在类加载时执行初始化代码。
javapublic class StaticBlockExample { static { System.out.println(Static block is executed.); }
public static void main(String[] args) { System.out.println(Main method is executed.); }}
总结:final和static关键字在Java编程中非常有用,它们可以增强代码的可读性和可维护性。对于学习者和工作者来说,掌握这两个关键字对于提高编程能力具有重要意义。需要的朋友可以参考以上内容。
这篇文章主要介绍了java多线程关键字final和static详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
final关键字
1.final关键字在单线程中的特点:
1)final修饰的静态成员:必须在进行显示初始化或静态代码块赋值,并且仅能赋值一次。
2)final修饰的类成员变量,可以在三个地方进行赋值:显示初始化、构造代码块和构造方法,并且仅能赋值一次。
3)final修饰的局部变量,必须在使用之前进行显示初始化(并不一定要在定义是赋值),仅能赋值一次。
总之,final修饰的静态成员必须在类加载完之前进行赋值,final修饰的成员变量,必须在对象创建完之前进行赋值。
补充:final修饰的基本数据类型不能被重新赋值,final修饰的引用数据类型,引用类型的地址不能改变,引用类型的内部属性可以改变。
2. final在多线程的作用
由于重排序的作用,一个线程读取到一个对象的引用时,该对象可能尚未初始化完毕,即这些线程可能读取到该对象字段的默认值而不是初始值。
final关键字具有特殊的作用:当一个对象发布到其他线程的时候,该对象的所有final字段都是初始化完成的,即其他线程读取到的都是相应字段的初始值而不是默认值。而非final字段就没有这种保障。
对于final修饰的引用类型的字段,该字段还能保障该字段所引用的对象 初始化完毕。
这种机制是通过禁止重排序实现的:
对于final变量的写:禁止final域的写重排序到构造方法之外,即得到一个对象的引用时,其内部的final域必定已被初始化完毕。
对于final域的读:禁止初次读该对象的引用与读该对象包含的final域进行重排序。
这两种重排序都是底层是通过内存屏障实现的,编译器会在final域写之后,构造函数执行完之前插入一个storestore屏障,在读final域之前插入一个loadload屏障。
static关键字
static关键字能够保证一个线程即使在未使用其他线程同步机制的情况下也总是可以读到一个类静态变量的初始值,但这种可见性的保障仅限于 初次读取该变量
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易盾网络。

