java中volatile的作用 volatile關鍵字在Java中有什么作用?
volatile關鍵字在Java中有什么作用?Volatile是為了防止指令重排序以確??梢娦詫τ贘VM級別,它是為了防止編譯器重排序同時,對于某些CPU,它們會通過緩存鎖或線程來解決緩存可見性但是,
volatile關鍵字在Java中有什么作用?
Volatile是為了防止指令重排序以確保可見性
對于JVM級別,它是為了防止編譯器重排序
同時,對于某些CPU,它們會通過緩存鎖或線程來解決緩存可見性
但是,目前很多CPU已經(jīng)過優(yōu)化,因為緩存一致性MESI會帶來性能開銷,因此使用storebuffer機制來進行異步處理,而這種機制會導致指令的無序執(zhí)行。這會導致可見性問題。
然后volatile將在CPU級別增加內存屏障,以解決由CPU無序執(zhí)行引起的可見性問題
1。Volatile是線程同步的輕量級實現(xiàn),因此Volatile的性能優(yōu)于synchronize;Volatile只能用來修改變量,synchronize可以用來修改方法和代碼塊。隨著JDK技術的發(fā)展,同步在執(zhí)行效率上會有很大的提高,所以同步在項目的過程中還是比較普遍的。對volatile的多線程訪問將不會阻塞;而同步將阻塞;
3。Volatile可以保證私有內存和主內存之間變量的同步,但不能保證變量的原子性;同步可以保證變量的原子性;
4。Volatile是多線程間變量的可見性;synchronize是多線程間訪問資源的同步;對于Volatile修改的變量,可以解決讀取時變量的可見性問題,但不能保證原子性。對于多線程訪問同一實例變量,需要鎖同步。