想象一下,有一个主线程创建一个 HashSet 并启动许多工作线程将 HashSet 传递给它们。
就像下面的代码一样:
void main() {
final Set<String> set = new HashSet<>();
final ExecutorService threadExecutor =
Executors.newFixedThreadPool(10);
threadExecutor.submit(() -> doJob(set));
}
void doJob(final Set<String> pSet) {
// do some stuff
final String x = ... // doesn't matter how we received the value.
if (!pSet.contains(x)) {
synchronized (pSet) {
// double check to prevent multiple adds within different threads
if (!pSet.contains(x)) {
// do some exclusive work with x.
pSet.add(x);
}
}
}
// do some stuff
}
我想知道仅在 add 方法上同步是否线程安全?contains如果不同步,是否有任何可能的问题?
我的直觉告诉我这很好,在离开同步块后,对 set 所做的更改应该对所有线程可见,但 JMM 有时可能是违反直觉的。
附注:我不认为它与How to lock multiple resources in java multithreading重复 ,尽管对这两个问题的回答可能相似,但这个问题解决了更多的特殊情况。
小唯快跑啊
森栏
临摹微笑
相关分类