gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:53:59 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com