Posted on 2010-11-18 14:45
楊羅羅 閱讀(1710)
評論(0) 編輯 收藏 所屬分類:
java.thread
volatile保證線程間的數(shù)據(jù)是可見的(共享的),但不保證數(shù)據(jù)同步
volatile相當(dāng)于synchronized的弱實(shí)現(xiàn),也就是說volatile實(shí)現(xiàn)了類似synchronized的語義,卻又沒有鎖機(jī)制。它確保對volatile字段的更新以可預(yù)見的方式告知其他的線程。
volatile包含以下語義:
(1)Java 存儲模型不會對valatile指令的操作進(jìn)行重排序:這個(gè)保證對volatile變量的操作時(shí)按照指令的出現(xiàn)順序執(zhí)行的。
(2)volatile變量不會被緩存在寄存器中(只有擁有線程可見)或者其他對CPU不可見的地方,每次總是從主存中讀取volatile變量的結(jié)果。也就是說對于volatile變量的修改,其它線程總是可見的,并且不是使用自己線程棧內(nèi)部的變量。也就是在happens-before法則中,對一個(gè)valatile變量的寫操作后,其后的任何讀操作理解可見此寫操作的結(jié)果。
volatile變量的特性不錯(cuò),但是volatile并不能保證線程安全的,也就是說volatile字段的操作不是原子性的,volatile變量只能保證可見性(一個(gè)線程修改后其它線程能夠理解看到此變化后的結(jié)果),要想保證原子性,目前為止只能加鎖!
volatile通常在下面的場景:
volatile boolean done = false;

…

while( ! done ){
dosomething();
}
應(yīng)用volatile變量的三個(gè)原則:
(1)寫入變量不依賴此變量的值,或者只有一個(gè)線程修改此變量
(2)變量的狀態(tài)不需要與其它變量共同參與不變約束
(3)訪問變量不需要加鎖