1. 讓我們首先了解下java 中 Volatile 關(guān)鍵字
? ? ?Volatile可實(shí)現(xiàn)java內(nèi)存模型當(dāng)中的可見(jiàn)性缀程,
? ? ?java內(nèi)存模型的可見(jiàn)性:
可見(jiàn)性妻坝,是指線程之間的可見(jiàn)性,一個(gè)線程修改的狀態(tài)對(duì)另一個(gè)線程是可見(jiàn)的铣鹏。也就是一個(gè)線程修改的結(jié)果敷扫,另一個(gè)線程馬上就能看到。
比如:用volatile修飾的變量诚卸,就會(huì)具有可見(jiàn)性葵第。volatile修飾的變量不允許線程內(nèi)部緩存和重排序,即直接修改內(nèi)存合溺。所以對(duì)其他線程是可見(jiàn)的卒密。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?BUT
Volatile 不保證原子性:
?just like this:
? volatile int a=0; a 具有可見(jiàn)性 但是如下操作仍然不具有原子性 a++;
讓我們看看什么是原子操作 什么是非原子操作:
原子操作:a=0棠赛;
非原子操作 a++哮奇,即a=a+1;
那么在java 中 如何保證原子性呢睛约?方法是 sync 屏镊,lock,unlock
2 .那么volatile的實(shí)現(xiàn)原理是什么痰腮?
? ? 先這樣理解:
? ? ?把對(duì)volatile變量的單個(gè)讀/寫(xiě)而芥,看成是使用同一個(gè)鎖對(duì)這些單個(gè)讀/寫(xiě)操作 ? ? 做了同步。示例:
? ? ? ? ? ? ?
示例程序
下面的程序等價(jià)于上面的示例程序
等價(jià)程序
volatile的特性:
? (1) 對(duì)一個(gè)volatile變量的單個(gè)讀/寫(xiě)操作膀值,與對(duì)一個(gè)普通變量的讀/寫(xiě)操作使用同一個(gè)鎖來(lái)同步棍丐,它們之間的執(zhí)行效果相同。
可見(jiàn)性:對(duì)一個(gè)volatile變量的讀沧踏,總是能看到(任意線程)對(duì)這個(gè)volatile變量最后的寫(xiě)入歌逢。
原子性:對(duì)任意單個(gè)volatile變量的讀/寫(xiě)具有原子性,但類似于volatile++這種復(fù)合操作不具有原子性翘狱。
3:來(lái)談?wù)?------鎖
? ? ? 3.1:釋放鎖和獲取鎖的內(nèi)存語(yǔ)義
? 當(dāng)線程釋放鎖時(shí)秘案,JMM會(huì)把該線程對(duì)應(yīng)的本地內(nèi)存中的共享變量刷新到主內(nèi)存中,示例代碼如下:
code