多執行緒程式設計學習十三(原子性 可見性與有序性)

2022-01-31 10:46:02 字數 785 閱讀 9072

原子(atom)指化學反應不可再分的基本微粒,原子在化學反應中不可分割。原子操作指的是不可分割的整體,多執行緒的原子性指的是沒有其他執行緒能夠中斷或檢查正在原子操作中的變數。

從記憶體模型來看,直接保證的原子性變數操作包括 read、load、assign、use、store 和 write,我們大致可以認為基本資料型別的訪問讀寫是具備原子性的。

從應用場景來看,jvm 保證原子性操作的主要有以下方式:

可見性是指當乙個執行緒修改了共享變數的值,其他執行緒能夠立即得知這個修改。

從應用場景來看,jvm 保證可見性主要有以下方式:

synchronized 等鎖機制。同步塊的可見性是由「對乙個變數執行 unlock 操作之前,必須先把此變數同步回主記憶體中(執行 store、write 操作)」這條規則獲得的。

final 關鍵字。被 final 修飾的字段在構造器中一旦初始化完成,並且構造器沒有把「this」的引用傳遞出去,那在其他執行緒中就能看到 final 關鍵字,並且該修飾能保證該物件一定是執行緒安全的。

private static final int i;

private final int j;

static

有序性是指如果在本執行緒內觀察,所有的操作都是有序的;如果在乙個執行緒中觀察另乙個執行緒,所有的操作都是無序的。前半句是指「執行緒內表現為序列的語義(as is serial)」,後半句是指「指令重排序」現象和「工作記憶體與主記憶體同步延遲」現象。

從應用場景來看,jvm 保證有序性主要有以下方式:

多執行緒學習一 可見性 原子性和有序性

在單核時代,所有的快取都操作同乙個cup上的快取,所以可見性很容易解決。當a執行緒更新了快取上的變數,那麼在b執行緒去訪問該變數的時候,拿到的一定是最新值。在多核時代,每個cup都有自己的快取區,當不同cup上的執行緒去訪問記憶體中的同個變數時,假設該變數在cup中都有快取。那麼不同cup上的執行緒...

執行緒的原子性與可見性

同步最基本的目的是保證原子性。另乙個容易忽略的目的是可見性,即乙個執行緒修改的共享資料對另乙個執行緒可見。因為一些基本型別的賦值操作本身是原子的。所以針對這些賦值操作在不使用synchronized的情況下,可以使用volatile來解決乙個執行緒的修改對另乙個執行緒的可見。所以volatile是在...

多執行緒學習 執行緒可見性

每個執行緒都有自己的空間去暫存資料 當有乙份資料在a,b執行緒之間共享 那麼在a執行緒中改變了b是不會馬上知道的 example 共享物件 多個物件在沒有同步的情況下會發生可見性的錯誤 public class sharingobjects1 system.out.println thread th...