volatile字段的寫入操作happens-before于每一個(gè)后續(xù)的同一個(gè)字段的讀操作。
因?yàn)閷?shí)際上put、remove等操作也會(huì)更新count的值,所以當(dāng)競(jìng)爭(zhēng)發(fā)生的時(shí)候,volatile的語(yǔ)義可以保證寫操作在讀操作之前,也就保證了寫操作對(duì)后續(xù)的讀操作都是可見(jiàn)的,這樣后面get的后續(xù)操作就可以拿到完整的元素內(nèi)容。
使用建議:在兩個(gè)或者更多的線程訪問(wèn)的成員變量上使用volatile。當(dāng)要訪問(wèn)的變量已在synchronized代碼塊中,或者為常量時(shí),不必使用。
一般說(shuō)來(lái),volatile用在如下的幾個(gè)地方:
1、中斷服務(wù)程序中修改的供其它程序檢測(cè)的變量需要加volatile;
2、多任務(wù)環(huán)境下各任務(wù)間共享的標(biāo)志應(yīng)該加volatile;
3、存儲(chǔ)器映射的硬件寄存器通常也要加volatile說(shuō)明,因?yàn)槊看螌?duì)它的讀寫都可能由不同意義;
聲明方式為 volatile declaration
備注
系統(tǒng)總是在 volatile
對(duì)象被請(qǐng)求的那一刻讀取其當(dāng)前值,即使上一條指令從同一對(duì)象請(qǐng)求值。而且,該對(duì)象的值在賦值時(shí)立即寫入。
volatile 修飾符通常用于由多個(gè)線程訪問(wèn)而不使用 lock 語(yǔ)句來(lái)序列化訪問(wèn)的字段。使用 volatile
修飾符能夠確保一個(gè)線程檢索由另一線程寫入的最新值。