Python知識分享網(wǎng) - 專業(yè)的Python學習網(wǎng)站 學Python,上Python222
Java并發(fā)編程手冊 PDF 下載
匿名網(wǎng)友發(fā)布于:2023-10-27 08:57:56
(侵權舉報)
(假如點擊沒反應,多刷新兩次就OK!)

Java并發(fā)編程手冊 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
運行這段代碼就會發(fā)現(xiàn),每次打印的兩個j值都是一樣的,而i的值卻是不同的。從這里就可以知道finalstatic
量的區(qū)別了。
finalvolatitle
這兩個變量看起來沒有什么關系,但是我學習JAVA內存模型時,感覺兩者還是有很多異同,下面我簡單總結一下。
禁止重排序規(guī)則:
對于volatitle,volatitle變量前面的賦值和取值,只能排在volatitle變量的前面,volatitle變量后面
賦值和取值,只能排在volatitle變量的后面,這個雷打不動!至于volatitle變量前面的賦值和取值,
比如 a=1,b=2,他們的排序就不能保證了,可能是b=2a=1,所以只能保證ab是排在volatitle
量前 面,volatitle變量后面的排序規(guī)則同上。(volatitle的排序規(guī)則,是針對volatitle的前后變量而言
)
對于final,它的禁止重排序規(guī)則和它前后的變量沒有任何關系,可以排在final前,也可以排在final后。
final的禁止重排序規(guī)則是針對構造函數(shù)而言的,也就是只有先給final賦值或者取值后,才能完成構造
函數(shù)的初始化,但是普通變量,可能是先初始化構造函數(shù),然后在給變量賦值。同理,當獲取某個對象
時,也是只能先成功獲取該對象的引用,再去獲取final成員變量的值,但是普通變量不能保證,可能會
導致普通變量的讀取,排在了獲取對象引用的前面。(final的排序規(guī)則,是針對final的成員變量和對
象的構造函數(shù)而言)
內存可見性:
兩者都有相同的內存可見性,對于final,這個值都不變,所有的線程看到的值都是一樣的,當然所有線
程可見。對于volatitle,它的值的改變,是強刷內存的,同時也會讓其它線程的本地緩存的值也相應改
變。
使用場景:
final主要是保證某個值不變,或者不類不被繼承。volatitle主要是保證多個線程對該變量的內存可
見性,常用于多個線程開始、結束的標記符等。所以說,兩者的使用場景,簡直是風馬牛不相及。