一種實踐是用 volatile 修飾 long 和 double 變量,使其能按原子類型來讀寫。
double 和 long 都是64位寬,因此對這兩種類型的讀是分為兩部分的,次讀取個 32 位,然后再讀剩下的 32 位,這個過程不是原子的,但 Java 中 volatile 型的 long 或 double 變量的讀寫是原子的。
volatile 修復符的另一個作用是提供內(nèi)存屏障(memory barrier),例如在分布式框架中的應用。
簡單的說,就是當你寫一個 volatile 變量之前,Java 內(nèi)存模型會插入一個寫屏障(write barrier),讀一個 volatile 變量之前,會插入一個讀屏障(read barrier)。
意思就是說,在你寫一個 volatile 域時,能保證任何線程都能看到你寫的值,同時,在寫之前,也能保證任何數(shù)值的更新對所有線程是可見的,因為內(nèi)存屏障會將其他所有寫的值更新到緩存。