Java基礎 volatile作用

2021-07-30 02:48:51 字數 509 閱讀 2219

解決的問題:

有時為了提高程式的執行效率,編譯器會進行優化,優化的方法就是講訪問的變數快取起來,程式讀取這個變數時直接到快取(例如暫存器)中來讀取,而不是去記憶體中讀取。這樣做的好處是提高了執行效率,但是遇到多執行緒時,有可能變數的值因為其他執行緒改變了,快取中的值不會改變,這樣會導致程式讀取的值和實際的值不一致。

解決:

volatile是乙個型別修飾符,它是被設計用來被不同執行緒訪問和修改的變數。

原理:

被volatile型別修飾的變數,系統每次用到它都會到記憶體中去讀取,而不會利用快取。因此,被volatile修飾的變數,所有執行緒在任何時候所看到的變數的值都是相同的。

注意:

volatile不能保證操作的原子性,因此,不能代替sychronized。而且使用volatile會阻止編譯器對**的優化,會降低程式的執行效率。不要使用volatile就盡量不要使用。

Java基礎整理 volatile知識點總結

volatile特性 為什麼保證可見性 無法解決執行緒安全問題 當出現多寫場景時無法保證原子性 public class test public static void main string args start while thread.activecount 1 保證前面的執行緒都執行完 th...

Java(多執行緒) volatile

現在有乙個靜態變數 x static int x 0 執行緒a執行 x 2 使用 volatile 修飾的變數對所有執行緒具有可見性,這就解決了我們上邊遇到的問題 當乙個執行緒改變了變數的值,會立刻同步到主記憶體中,其它執行緒讀取時,也會從主記憶體中得到最新的值。volatile 的可見性是基於先行...

Java多執行緒 volatile詳解

1 可見性 2 禁止指令重排序 注 volatile的非原子性,在i 或i i 1 會出現不安全。1 lock字首指令會引起處理器快取寫到記憶體,執行緒的本地記憶體失效,別的執行緒只能從主存中讀取資料。而本地記憶體的值會立馬重新整理到主存中去。lock又分為鎖匯流排還是鎖快取 2 乙個處理器的快取回...