0

我有這個循環,啓動工作線程,該減量當他們完成了一個的AtomicInteger,我有一張支票在一項任務啓動時,得到0AtomicInteger的check-then-act的這種用法需要同步嗎?

private static AtomicInteger dataReadings; 

void someMethod() { 
    dataReadings = new AtomicInteger(objects.size()); 
    for (Object object: objects) 
      LongAction.perform(object).setResultCallback(new LongActionCallback<Object>() { 
       @Override 
       public void onResult(Object object) { 
        if (dataReadings.decrementAndGet() == 0) { 
         doSomething(); 
        } 
       } 
      }); 
     } 
} 

所以我的問題是,我應該同步以下部分代碼:

if (dataReadings.decrementAndGet() == 0) { 
    doSomething(); 
} 

如果我應該怎麼做?使用同步塊?我應該同步什麼?

+0

我們無法真正知道你要在這裏實現什麼,什麼對象是,哪些線程正在做什麼,等等。但如果對象是由幾個線程同時修改,你希望dataReadings總是變爲0時,所有對象已經被處理,那麼你的代碼就不是線程安全的。然而,同步你所問的代碼片段並不會使它更安全。 –

+0

儘管(或者可能使其成爲本地變量),您需要同步「dataReadings」字段的賦值和讀取。 – yshavit

+0

@JBNizet爲什麼它不是安全的?我希望dataReadings總是達到0,是的。我該怎麼辦? –

回答

1

AtomicInteger的整點是其中的每一個函數都是原子,包括decrementAndGet()

如果您使用兩次AtomicInteger,則只需要鎖定,因爲兩次調用之間可能會發生變化。 (並且你只需要鎖定,如果你在意它是否改變)