我无法使用集契约(Contract)步两个线程:
private Set<String> set;
...
set = Collections.synchronizedSet(new HashSet<String>());
并将其传递给两个线程。一个访问:
synchronized (set) {
// [1]
if (set.contains(str)) {
...
} else {
// [3]
}
}
和另一个更新:
synchronized (set) {
set.add(str); // [2]
...
}
发生的事情是 [1]、[2]、[3] 按顺序发生。在 [1] 期间,集合中还没有我要找的项目是正确的。但随后 [2] 通过添加该项目对其进行了更新。在 [3] 期间,我现在看到了该项目。我该如何解决?我还有一个由相同线程共享的 ConcurrentHashMap,但它工作得很好。该集合与 ConcurrentHashMAp 的等价物是什么?
更新:代码太长。无论如何,我更新后的问题是 - 该集合与 ConcurrentHAshMap 的等价物是什么?
最佳答案
您正在正确同步访问。实际上,将它包装在 synchronizedSet()
中不会产生任何额外的效果。没有 ConcurrentHashSet
,但您可以从 Collections.newSetFromMap()
和 ConcurrentHashMap
中获得相同的东西。但这不是问题。
问题出在您的代码中的其他地方。例如:你确定你在同一台机器上同步吗?您的 key 是否正确实现了 hashCode()
和 equals()
?您是否让它们可变(坏主意)并且某些东西正在改变 key ?
关于java - 使用 synchronizedSet 同步两个线程之间的访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7857702/