[英]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提供了許多其他方法來實現線程安全( Lock , CountDownLatch , Semaphore ,...),但由於您指的是AtomicInteger,我相信AtomicInteger.compareAndSet()更准確地符合您的要求:
if (count.compareAndSet(0, 1)) {
// executed if count == 0
count.set(0);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.