使用synchronizedSet来同步两个线程之间的访问

时间:2011-10-22 05:49:36

标签: java multithreading synchronization thread-safety set

我无法使用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相当的集合?

1 个答案:

答案 0 :(得分:6)

您正在正确同步访问权限。实际上,将它包装在synchronizedSet()中并没有任何额外的效果。虽然您可以从ConcurrentHashSetCollections.newSetFromMap()获得相同的内容,但没有ConcurrentHashMap。但这不是问题所在。

问题出在代码的其他地方。例如:你确定你在同一套上进行同步吗?是您正确实施hashCode()equals()的关键?你让它们变得可变(坏主意)有什么东西在换键吗?