java - AtomicInteger 的 check-then-act 用法是否需要同步?

标签 java multithreading asynchronous concurrency synchronization

我有一个启动工作线程的循环,当它们完成时会递减一个 AtomicInteger,并且当它达到 0 时我会检查是否启动任务。

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();
}

如果我应该,怎么做?使用同步块(synchronized block)?我应该同步什么?

最佳答案

AtomicInteger 的要点在于其中的每个函数都是原子,包括 decrementAndGet()

只有在使用 AtomicInteger 两次时才需要锁定,因为这样它可能会在两次调用之间发生变化。 (只有当你关心它是否改变时才需要锁定)

关于java - AtomicInteger 的 check-then-act 用法是否需要同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45718749/

相关文章:

java - OrientDB 使用对象 API 一对多

java - MyBatis - 为 Oracle 编写映射器,同时针对 H2 进行测试

wpf - 我应该使用哪种 WPF 线程方法?

javascript - 从 axios 调用中 react redux 设置初始状态

c# - Async/Await 如何处理 "old"结果?

java - 拦截器API : in a classic java project

c++ - Qt 槽调用两次

java - 有没有办法确定 newFixedThreadPool 队列中有多少个可运行对象?

c# - 实现异步方法 wcf

java - 检查日期格式的验证未按预期工作