1、volatile
volatile字段的寫入操作happens-before于每一個后續的同一個字段的讀操作。
因為實際上put、remove等操作也會更新count的值,所以當競爭發生的時候,volatile的語義可以保證寫操作在讀操作之前,也就保證了寫操作對后續的讀操作都是可見的,這樣后面get的后續操作就可以拿到完整的元素內容。
使用建議:在兩個或者更多的線程訪問的成員變量上使用volatile。當要訪問的變量已在synchronized代碼塊中,或者為常量時,不必使用。
volatile實際上只有在多cpu或者多核下才有用。當讀取數據時,他不會cache緩存中讀取,而是強制從內從中讀取,這樣讀到的就是最新值。當寫入數據的時候,會直接將數據寫入內存中,并刷新所有其他核中的緩存,這樣其他核看到的就是最新寫入的值,也就是說,其他線程就看到了最新寫入的值。
一般說來,volatile用在如下的幾個地方:
1、中斷服務程序中修改的供其它程序檢測的變量需要加volatile;
2、多任務環境下各任務間共享的標志應該加volatile;
3、存儲器映射的硬件寄存器通常也要加volatile說明,因為每次對它的讀寫都可能由不同意義;
聲明方式為 volatile declaration
備注
系統總是在 volatile
對象被請求的那一刻讀取其當前值,即使上一條指令從同一對象請求值。而且,該對象的值在賦值時立即寫入。
volatile 修飾符通常用于由多個線程訪問而不使用 lock 語句來序列化訪問的字段。使用 volatile
修飾符能夠確保一個線程檢索由另一線程寫入的最新值。