Java资源分享网 - 专业的Java学习网站 学Java,上Java资源分享网
Java并发编程手册 PDF 下载
匿名网友发布于:2024-03-17 16:18:10
(侵权举报)
(假如点击没反应,多刷新两次就OK!)

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

 

 

 

资料内容:

 

finalstatic

很多时候会容易把static和final关键字混淆,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的值却是不同的。从这里就可以知道final和static变

量的区别了。

finalvolatitle

这两个变量看起来没有什么关系,但是我学习JAVA内存模型时,感觉两者还是有很多异同,下面我简单总结一下。

禁止重排序规则:

对于volatitle,volatitle变量前面的赋值和取值,只能排在volatitle变量的前面,volatitle变量后面

赋值和取值,只能排在volatitle变量的后面,这个雷打不动!至于volatitle变量前面的赋值和取值,

比如 a=1,b=2,他们的排序就不能保证了,可能是b=2,a=1,所以只能保证a和b是排在volatitle变

量前 面,volatitle变量后面的排序规则同上。(volatitle的排序规则,是针对volatitle的前后变量而言

的)

对于final,它的禁止重排序规则和它前后的变量没有任何关系,可以排在final前,也可以排在final后。

final的禁止重排序规则是针对构造函数而言的,也就是只有先给final赋值或者取值后,才能完成构造

函数的初始化,但是普通变量,可能是先初始化构造函数,然后在给变量赋值。同理,当获取某个对象

时,也是只能先成功获取该对象的引用,再去获取final成员变量的值,但是普通变量不能保证,可能会

导致普通变量的读取,排在了获取对象引用的前面。(final的排序规则,是针对final的成员变量和对

象的构造函数而言)

内存可见性:

两者都有相同的内存可见性,对于final,这个值都不变,所有的线程看到的值都是一样的,当然所有线

程可见。对于volatitle,它的值的改变,是强刷内存的,同时也会让其它线程的本地缓存的值也相应改

变。

使用场景:

final主要是保证某个值不变,或者不类不被继承。volatitle主要是保证多个线程对该变量的内存可

见性,常用于多个线程开始、结束的标记符等。所以说,两者的使用场景,简直是风马牛不相及。