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

Java并發(fā)編程手冊 PDF 下載   圖1

 

 

 

資料內(nèi)容:

 

 

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