java - 我是否需要在保证发生之前的对象上进行同步?

标签 java multithreading synchronization locking thread-safety

我有一个保证跨线程可见的集合。但是,这并不能保证存储在该集合中的项目状态的可见性(例如,如果我有 StringBuilder 集合(可变的,非线程安全的),那么我必须在写入/读取期间同步集合中的每个项目,对吗? )。那么,当我拥有用于​​保证自身发生之前的对象集合(例如倒计时闩锁)时会发生什么。调用await/countDown 时是否需要以某种方式同步每个项目?下面的代码大致说明了这个困境:

public class SyncQuestion {

final List<CountDownLatch> lathces = new ArrayList<CountDownLatch>();

SyncQuestion() {
    lathces.add(new CountDownLatch(1));
}

public static void main(String[] args) throws InterruptedException {
    final SyncQuestion sync = new SyncQuestion();

    final Thread sleepingThread = new Thread() {
        public void run() {
            for (CountDownLatch latch : sync.lathces) {
                try {
                    latch.await();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        };
    };

    final Thread wakingThread = new Thread() {
        public void run() {
            for (CountDownLatch latch : sync.lathces) {
                latch.countDown();
            }
        };
    };

    sleepingThread.start();
    wakingThread.start();
    sleepingThread.join();
    wakingThread.join();
}

}

如果我的假设有误,请纠正我。

最佳答案

CountDownLatch 基本上是 AbstractQueuedSynchronizer 的包装器,其状态是一个通过 Unsafe.compareAndSwapInt (这是一个原子操作)。

因此,在这种特定情况下,正如 Cameron Skinner 所说,无需同步,因为它会强制执行先发生的操作。

关于java - 我是否需要在保证发生之前的对象上进行同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4394281/

相关文章:

java - 使用 Color.brighter 方法打印红、绿、蓝值

javascript - 如何检查 WebView Javascript 接口(interface)是否可用?

java - 如何为 Apache Maven Infoker 插件创建和放置 BeanShell 脚本?

java - 尽管保护写操作仍获取竞争条件 - Java

java - 使用异步 http 提高吞吐量

c++ - 为 WaitforMultipleObjects 增加 MAXIMUM_WAIT_OBJECTS

python - Flask 后台网页抓取和数据库更新

java - 运行 python -m http.server XXXX 是否安全

mobile - Unity3D-向附近的其他手机发送消息

meteor - 如何使 Meteor 方法同步?