簡體   English   中英

!boolean是Java中的原子操作嗎?

[英]Is the !boolean a atomic operation in java?

下面的代碼可以在多線程中工作嗎? !boolean是Java中的原子操作嗎?

volatile boolean flag = true;
if (!flag){
    do something
}

由於已將其標記為volatile且該值是原始值,因此可以確保讀取始終是一致的(不可能讀取部分初始化的值)。

即使未標記為volatile ,JVM也會始終自動讀取存儲在32位或更小值中的任何原始值。 這是JLS 17.6中語言的要求。 (JLS 17.7允許“字撕裂” 64位原始值(即longdouble )表示這種行為是特定於實現的。實際上,在我所知道的所有生產64位JVM實現中,甚至讀取了64位。位值始終是原子的。)

讀取布爾值的操作可能不是原子操作,但是如果是這樣,則可以通過將布爾值復制到JVM指令堆棧來工作,因此仍然沒有數據損壞的可能性(因為將值壓入操作數堆棧是一種原子操作)。 JIT更有可能只是反轉您的if條件並跳轉到另一個分支,而不是實際反轉布爾值。

當然,您仍然不能保證不會在另一個線程更改該值之前立即讀取該值,因此從字面上看,下一條指令可能會在另一個線程將布爾值設置為true的同時開始執行。

是Java的!boolean a [n]原子操作嗎?

否。這里有三個操作:

  1. 加載變量
  2. 比較並分支。
  3. '做一點事'。

線程切換可以發生在1和2之間,或者2和3之間,並且底層布爾值可以在任何時候,3或之后改變。

因此,如果要確保僅在flag 同時為 false時才執行“操作”,則必須進行同步或使用信號量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM