[英]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位原始值(即long
和double
)表示這種行為是特定於實現的。實際上,在我所知道的所有生產64位JVM實現中,甚至讀取了64位。位值始終是原子的。)
讀取布爾值的操作可能不是原子操作,但是如果是這樣,則可以通過將布爾值復制到JVM指令堆棧來工作,因此仍然沒有數據損壞的可能性(因為將值壓入操作數堆棧是一種原子操作)。 JIT更有可能只是反轉您的if
條件並跳轉到另一個分支,而不是實際反轉布爾值。
當然,您仍然不能保證不會在另一個線程更改該值之前立即讀取該值,因此從字面上看,下一條指令可能會在另一個線程將布爾值設置為true的同時開始執行。
是Java的
!boolean
a [n]原子操作嗎?
否。這里有三個操作:
線程切換可以發生在1和2之間,或者2和3之間,並且底層布爾值可以在任何時候,3或之后改變。
因此,如果要確保僅在flag
同時為 false時才執行“操作”,則必須進行同步或使用信號量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.