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的等价是什么?
您正在正确同步访问.实际上,包装它在synchronizedSet()这里没有任何额外的影响.没有ConcurrentHashSet,虽然你可以种得到同样的事情Collections.newSetFromMap()和ConcurrentHashMap.但这不是问题.
问题出在代码中的其他位置.例如:你确定你在同一套上进行同步吗?是你的钥匙实施hashCode()和equals()正确?你让它们变得可变(坏主意)并且有些东西正在改变键吗?
| 归档时间: |
|
| 查看次数: |
17761 次 |
| 最近记录: |