volatile關鍵字和記憶體可見性

2021-10-08 09:50:04 字數 670 閱讀 1830

當多個執行緒訪問共享資源時,彼此的執行緒不可見。

啟動程式後,會生成兩個執行緒主線程和子執行緒。根據**所示,程式執行應該會結束。但是由於記憶體可見性問題導致程式無法終止。

public

class

volatiledemo}}

}class

threaddemo

implements

runnable

public

boolean

isflag()

public

void

setflag

(boolean flag)

}

1、用sychronized關鍵字,對執行緒實現鎖。缺點是效率非常低。

while

(true)}

}

2、常用方法:用volatile關鍵字,當多個執行緒訪問共享資源時,彼此的執行緒可見。

原理:兩個執行緒相當於在主存中對共享資料進行修改。

private

volatile

boolean flag=

false

;

1、volatile關鍵字不保證「互斥性」。

2、volatile關鍵字不能保證「原子性」。

關鍵字volatile和register

用關鍵字volatile宣告變數,是用來告訴編譯器每次對此變數的引用都需要從記憶體位址中讀取,即取消編譯器對此變數的優化編譯。當某次引用沒用volatile宣告的變數時,其被編譯器從記憶體位址中讀取到ax 某通用暫存器 中,那麼在其後的引用中,如果ax暫存器沒用被改變,那麼編譯器會優化成直接讀取ax...

關鍵字 mutable和volatile

1 mutable 在c 中,mutable是為了突破const的限制而設定的。被mutable修飾的變數,將永遠處於可變的狀態,即使在乙個const函式中,甚至結構體變數或者類物件為const,其mutable成員也可以被修改。1.structst 2.3.10.11.constst st 12....

關鍵字volatile和restrict

一 什麼是volatile?什麼是編譯器優化 volatile是乙個型別修飾符,它的主要作用是防止編譯器進行優化。那麼什麼是編譯器優化呢,我們看兩個個例子 例1 x 0x04 x 0x06 x 0x08 對於硬體來說這是3條指令,依次執行,但是如果讓編譯器進行編譯,則它會忽略前面兩條語句,直接得到 ...