時(shí)間都去哪兒了?
游戲玩得眼睛都花了
wang者峽谷一天天
轉(zhuǎn)眼2018就要過(guò)完了……
再不努力我們就老了,沒(méi)有時(shí)間用來(lái)浪費(fèi)了。
不努力的人一定不酷,學(xué)java的你必學(xué)volatile。
volatile是Java 中的一個(gè)關(guān)鍵字。
Volatile的使用條件:
雖然volatile可以實(shí)現(xiàn)輕量級(jí)的同步機(jī)制,但是使用volatile修飾的變量必須滿足以下兩個(gè)條件:
對(duì)變量的寫(xiě)操作不依賴于當(dāng)前值,或者確保只有一個(gè)線程修改變量的值;
該變量沒(méi)有包含在具有其他變量的不變式中。
Volatile的三大特性:
1. volatile 變量具有 synchronized 的可見(jiàn)性特性,及如果一個(gè)字段被聲明為volatile,java線程內(nèi)存模型確保所有的線程看到這個(gè)變量的值是一致的。
鎖提供了兩種主要特性:互斥和可見(jiàn)性,互斥即一次只允許一個(gè)線程持有某個(gè)特定的鎖,因此可使用該特性實(shí)現(xiàn)對(duì)共享數(shù)據(jù)的協(xié)調(diào)訪問(wèn)協(xié)議,這樣,一次就只有一個(gè)線程能夠使用該共享數(shù)據(jù)。可見(jiàn)性要更加復(fù)雜一些,它必須確保釋放鎖之前對(duì)共享數(shù)據(jù)做出的更改對(duì)于隨后獲得該鎖的另一個(gè)線程是可見(jiàn)的。
2.禁止進(jìn)行指令重排序
重排序通常是編譯器或運(yùn)行時(shí)環(huán)境為了優(yōu)化程序性能而采取的對(duì)指令進(jìn)行重新排序執(zhí)行的一種手段。
重排序時(shí),以volatile修飾屬性的讀、寫(xiě)操作代碼行為分界線,讀、寫(xiě)操作前面的代碼不許排序到后面,后面同理不許排序到前面。由此bao證有序性。
3.不保證原子性
關(guān)于volatile實(shí)現(xiàn)的可見(jiàn)性可能會(huì)誤解,認(rèn)為既然volatile變量所有的寫(xiě)操作都會(huì)立刻反應(yīng)到其它線程中,那么對(duì)volatile變量進(jìn)行并發(fā)操作就是安全的。有這個(gè)誤解是因?yàn)楹雎粤嗽有裕瑅olatile是不bao證原子性的。對(duì)一個(gè)變量進(jìn)行修改賦值操作,可能寫(xiě)的就是一條簡(jiǎn)單的i=i+1,但是底層實(shí)現(xiàn)上會(huì)需要多條字節(jié)碼指令來(lái)完成,同時(shí)一條字節(jié)碼指令也可能轉(zhuǎn)化成多條機(jī)器碼指令,在并發(fā)情況下,這些指令的執(zhí)行不能bao證原子性。
Volatile的應(yīng)用場(chǎng)景:
由于volatile bao證可見(jiàn)性和有序性,被volatile修飾的共享屬性一般并發(fā)讀/寫(xiě)沒(méi)有問(wèn)題,可看做是一種輕量級(jí)的synchronized實(shí)現(xiàn)。
再不努力我們就老了
沒(méi)有拼搏怎么成長(zhǎng)呢
誠(chéng)筑說(shuō)在這里等你呢
Java課程你值得擁有!



,咨詢QQ:
