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

标签 java multithreading synchronization thread-safety set

我无法使用集契约(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/

相关文章:

git - 如何更新或同步 GitHub 上的 fork 存储库?

java - Webapp - 自定义进度条

c++ - atomic_compare_exchange 与互斥锁

c++ - shared_future<void> 是 condition_variable 的合法替代品吗?

javascript - sencha 应用程序在 ui 线程上呈现速度变慢

ios - 与 SWIFT 同步键值信息的简便方法

java - 如何在不阻塞的情况下避免并发执行一个耗时的任务?

java - 如何在 java.net.URLConnection 上指定本地地址?

java - 删除文本文件中的最后一行

java - 如何从JAVA中的for循环的最后一次迭代中获取字符串?