我无法使用set同步两个线程:
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相当的集合?
答案 0 :(得分:6)
您正在正确同步访问权限。实际上,将它包装在synchronizedSet()
中并没有任何额外的效果。虽然您可以从ConcurrentHashSet
和Collections.newSetFromMap()
获得相同的内容,但没有ConcurrentHashMap
。但这不是问题所在。
问题出在代码的其他地方。例如:你确定你在同一套上进行同步吗?是您正确实施hashCode()
和equals()
的关键?你让它们变得可变(坏主意)有什么东西在换键吗?