Python知识分享网 - 专业的Python学习网站 学Python,上Python222
Java并发编程手册 PDF 下载
发布于:2023-10-27 08:57:56
(假如点击没反应,多刷新两次就OK!)

Java并发编程手册 PDF 下载   图1

 

 

 

资料内容:

 

 

finalstatic
很多时候会容易把staticfinal关键字混淆,static作用于成员变量用来表示只保存一份副本,而final的作用是用
来保证变量不可变。看下面这个例子:
class MyClass {
public final double i = Math.random();
public static double j = Math.random();
}
public class Test2 {
public static void main(String[] args)
{ MyClass myClass1 = new MyClass();
MyClass myClass2 = new MyClass();
System.out.println(myClass1.i);
System.out.println(myClass1.j);
System.out.println(myClass2.i);
System.out.println(myClass2.j);
}
}
// 出:
// 0.6885279073145978
// 0.7678464493258529
// 0.5645174724833194
// 0.7678464493258529
运行这段代码就会发现,每次打印的两个j值都是一样的,而i的值却是不同的。从这里就可以知道finalstatic
量的区别了。
finalvolatitle
这两个变量看起来没有什么关系,但是我学习JAVA内存模型时,感觉两者还是有很多异同,下面我简单总结一下。
禁止重排序规则:
对于volatitlevolatitle变量前面的赋值和取值,只能排在volatitle变量的前面,volatitle变量后面
赋值和取值,只能排在volatitle变量的后面,这个雷打不动!至于volatitle变量前面的赋值和取值,
比如 a=1b=2,他们的排序就不能保证了,可能是b=2a=1,所以只能保证ab是排在volatitle
量前 面,volatitle变量后面的排序规则同上。(volatitle的排序规则,是针对volatitle的前后变量而言
)
对于final,它的禁止重排序规则和它前后的变量没有任何关系,可以排在final前,也可以排在final后。
final的禁止重排序规则是针对构造函数而言的,也就是只有先给final赋值或者取值后,才能完成构造
函数的初始化,但是普通变量,可能是先初始化构造函数,然后在给变量赋值。同理,当获取某个对象
时,也是只能先成功获取该对象的引用,再去获取final成员变量的值,但是普通变量不能保证,可能会
导致普通变量的读取,排在了获取对象引用的前面。(final的排序规则,是针对final的成员变量和对
象的构造函数而言)
内存可见性:
两者都有相同的内存可见性,对于final,这个值都不变,所有的线程看到的值都是一样的,当然所有线
程可见。对于volatitle,它的值的改变,是强刷内存的,同时也会让其它线程的本地缓存的值也相应改
变。
使用场景:
final主要是保证某个值不变,或者不类不被继承。volatitle主要是保证多个线程对该变量的内存可
见性,常用于多个线程开始、结束的标记符等。所以说,两者的使用场景,简直是风马牛不相及。