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

jas*_*ine 3 java multithreading synchronization set thread-safety

我无法使用set同步两个线程:

private Set<String> set;
...
set = Collections.synchronizedSet(new HashSet<String>());
Run Code Online (Sandbox Code Playgroud)

并将其传递给两个线程.一个访问:

synchronized (set) {
    // [1]
    if (set.contains(str)) {
    ...
    } else {
        // [3]
    }
}
Run Code Online (Sandbox Code Playgroud)

和另一个更新:

synchronized (set) {
    set.add(str);   // [2]
...
}
Run Code Online (Sandbox Code Playgroud)

会发生的是[1],[2],[3]按顺序发生.在[1]期间,该集合还没有我正在寻找的项目是正确的.但后来[2]通过添加项目来更新它.在[3]期间,我现在看到了这个项目.我该如何解决?我也有一个ConcurrentHashMap由相同的线程共享,但它工作得很好.什么是与ConcurrentHashMAp相当的集合?

更新:代码太长.无论如何,我更新的问题是 - 该集合与ConcurrentHAshMap的等价是什么?

Sea*_*wen 6

您正在正确同步访问.实际上,包装它在synchronizedSet()这里没有任何额外的影响.没有ConcurrentHashSet,虽然你可以种得到同样的事情Collections.newSetFromMap()ConcurrentHashMap.但这不是问题.

问题出在代码中的其他位置.例如:你确定你在同一套上进行同步吗?是你的钥匙实施hashCode()equals()正确?你让它们变得可变(坏主意)并且有些东西正在改变键吗?