簡體   English   中英

AtomicInteger和Compare操作

[英]AtomicInteger and Compare operations

我正在嘗試使用AtomicInteger變量作為鎖。 所以,想知道下面發布的代碼是否是線程安全的。 我知道incrementAndGet()是一個原子操作。 但是,我不確定后續的'=='操作是否也是原子操作(如果在進行比較時值增加到2,該怎么辦)。 所以發布這個問題來聽你的想法。

private AtomicInteger count = new AtomicInteger(0); //Shared variable
private final int max = 1;

if(count.incrementAndGet() == max) {
  //Do something
}

由於incrementAndGet()是一個原子操作,因此最多只有一個線程的結果為1 (只要AtomicInteger沒有設置為低於1的值)。 這是由AtomicInteger保證的。 雖然實際比較不是此原子操作的一部分,但只有收到1的線程才會進入if塊。 那是因為比較比較了int類型的兩個值: incrementAndGet()的結果和max AtomicInteger在其中不起作用,因為當count的內部狀態改變時,原始int不會改變它的值。 tl; dr:您的代碼相當於:

final int val = count.incrementAndGet(); // (it makes no difference if val is not 'final`)
if (val == max) {
    // ...
}

Java提供了許多其他方法來實現線程安全( LockCountDownLatchSemaphore ,...),但由於您指的是AtomicInteger,我相信AtomicInteger.compareAndSet()更准確地符合您的要求:

if (count.compareAndSet(0, 1)) {
    // executed if count == 0
    count.set(0);
}

暫無
暫無

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

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