gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 19:20:44 27 4
gpt4 key购买 nike

我有一个保证跨线程可见的集合。但是,这并不能保证存储在该集合中的项目状态的可见性(例如,如果我有 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com