一叹谁、是什么
? ? volatile是Java提供的一種輕量級(jí)的同步機(jī)制。Java語言包含兩種內(nèi)在的同步機(jī)制:同步塊(或方法)和volatile變量期吓,相比于synchronized早歇,它更為輕量級(jí),因?yàn)樗粫?huì)引起線程上下文的切換和調(diào)度。但是volatile變量的同步性較差箭跳,而且其使用也更容易出錯(cuò)晨另。
二、并發(fā)編程的三個(gè)概念
????1. 原子性:即一個(gè)操作或者多個(gè)操作谱姓,要么全部執(zhí)行并且執(zhí)行的過程不會(huì)被任何因素打斷借尿,要么就都不執(zhí)行。
Java中的原子性操作包括:
a. 基本類型的讀取和賦值操作屉来,且賦值必須是數(shù)字賦值給變量路翻,變量之間的相互賦值不是原子性操作。
b.所有引用reference的賦值操作
c.java.concurrent.Atomic.* 包中所有類的一切操作
? ? 2.可見性:指當(dāng)多個(gè)線程訪問同一個(gè)變量時(shí)奶躯,一個(gè)線程修改了這個(gè)變量值帚桩,其他線程能夠立即看得到修改的值。
Java提供了volatile來保證可見性嘹黔,當(dāng)一個(gè)線程修改共享變量后,他會(huì)立即被更新到主內(nèi)存中莫瞬,其他線程讀取共享變量時(shí)儡蔓,會(huì)直接從主內(nèi)存中讀取。
synchronize和Lock都可以保證可見性疼邀。synchronized和Lock能保證同一時(shí)刻只有一個(gè)線程獲取鎖然后執(zhí)行同步代碼喂江,并且在釋放鎖之前會(huì)將對(duì)變量的修改刷新到主存當(dāng)中。因此可以保證可見性旁振。
? ? 3.有序性:即程序執(zhí)行的順序按照代碼的先后順序執(zhí)行
Java內(nèi)存模型中的有序性可以總結(jié)為:如果在本線程內(nèi)觀察获询,所有操作都是有序的;如果在一個(gè)線程中觀察另一個(gè)線程拐袜,所有操作都是無序的吉嚣。前半句是指“線程內(nèi)表現(xiàn)為串行語義”,后半句是指“指令重排序”現(xiàn)象和“工作內(nèi)存主主內(nèi)存同步延遲”現(xiàn)象蹬铺。
三尝哆、鎖的互斥性和可見性
????鎖提供了兩種特性:互斥(mutual exclusion) 和可見性(visibility)。
互斥:一次只允許一個(gè)線程持有某個(gè)特定的值甜攀,一次只有一個(gè)線程能使用該共享數(shù)據(jù)秋泄。 可見性:當(dāng)一條線程修改了共享變量的值,新值對(duì)于其他線程來說是可以立即得知的规阀。
四恒序、Java內(nèi)存模型
????之前已經(jīng)寫過了,參考:http://www.reibang.com/p/0c4632c0f849
五谁撼、volatile變量的特性
? ? (1)保證可見性歧胁,不保證原子性
? ? ? ? a. 當(dāng)寫一個(gè)volatile變量時(shí),JMM會(huì)把該線程本地內(nèi)存中的變量強(qiáng)制刷新到主內(nèi)存中;
? ? ? ? b. 這個(gè)寫操作會(huì)導(dǎo)致其他線程中的緩存無效与帆。
? ? (2)禁止指令重排
? ? ? ? 指令重排是指編譯器和處理器為了優(yōu)化程序性能而對(duì)指令序列進(jìn)行排序的一種手段了赌。使用volatile關(guān)鍵字修飾共享變量便可以禁止這種重排序。若用volatile修飾共享變量玄糟,在編譯時(shí)勿她,會(huì)在指令序列中插入內(nèi)存屏障來禁止特定類型的處理器重排序。
? ? (3)volatile不適用于復(fù)合操作阵翎,只適用于原子操作逢并。涉及到復(fù)合操作的線程安全問題要使用synchronized或者lock處理。
六郭卫、volatile原理? ? ? ?
? ? volatile可以保證線程可見性且提供了一定的有序性砍聊,但是無法保證原子性。在JVM底層volatile是采用“內(nèi)存屏障”來實(shí)現(xiàn)的贰军。加入了volatile關(guān)鍵字后的匯編代碼會(huì)多出一個(gè)lock前綴指令玻蝌,實(shí)際上相當(dāng)于一個(gè)內(nèi)存屏障,它會(huì)做以下三個(gè)步驟:
? ? 1. 確保指令重排時(shí)不會(huì)將其后面的指令排到內(nèi)存屏障之前的位置词疼,也不會(huì)把前面的指令排到內(nèi)存屏障的后面俯树;即在執(zhí)行到內(nèi)存屏障這句指令時(shí),在它前面的操作已經(jīng)全部完成贰盗;
? ? 2. 它會(huì)強(qiáng)制將對(duì)緩存的修改操作立即寫入主庫许饿;
? ? 3. 如果是寫操作,她會(huì)導(dǎo)致其他CPU中對(duì)應(yīng)的緩存行無效舵盈。