Java多執行緒 volatile詳解

2021-09-11 01:51:14 字數 885 閱讀 4750

(1)可見性

(2)禁止指令重排序

注:volatile的非原子性,在i++或i=i+1;會出現不安全。

(1)lock字首指令會引起處理器快取寫到記憶體,執行緒的本地記憶體失效,別的執行緒只能從主存中讀取資料。而本地記憶體的值會立馬重新整理到主存中去。(lock又分為鎖匯流排還是鎖快取)

(2)乙個處理器的快取回寫到記憶體會導致其他處理器的快取無效。

檢查某個狀態標記以判斷是否退出迴圈

public class demo  catch (interruptedexception e) 

}d.run = true;

}}).start();

new thread(new runnable()

system.err.println("執行緒2執行了...");

}}).start();

volatile和synchronized的區別?

(1)volatile保證變數的可見性,即只保證了對volatile變數讀和寫操作的原子性,並不能保證對i++這種復合操作的原子性。                  而synchronized則是鎖定當前臨界資源,只有當前執行緒可以訪問該資源,其他執行緒被阻塞住。保證了可見性和原子性。

(2)volatile僅能使用在變數級別;synchronized則可以使用在變數、方法、和**塊和類。

(3)volatile不會造成執行緒的阻塞;synchronized可能會造成執行緒的阻塞。

Java(多執行緒) volatile

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

多執行緒 volatile

目錄 1.volatile關鍵字的兩層含義 2.volatile關鍵字的原理和實現機制 3.volatile關鍵字的使用場景 4.volatile關鍵字與synchronized關鍵字的比較 1 保證了不同執行緒對這個變數進行操作的可見性。2 禁止進行指令重排序,能在一定程度上保持有序性。volat...

多執行緒 volatile

volatile主要用途 1 保證可見性 對volatile變數的寫指令後會加入寫屏障 寫屏障 在屏障之前的對共享變數的改動都同步到主存 對volatile變數的讀指令前會加入讀屏障 讀屏障 在該屏障之後對共享變數的讀取載入的都是主存中的新資料 2 保證有序性 寫屏障保證指令重排序時,不會講寫屏障之...