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,则只需要锁定,因为两次调用之间可能会发生变化。 (并且你只需要锁定,如果你在意它是否改变)