我需要针对唯一键(即 1(a,b) 2(c,d) 等)跟踪多个值...
该解决方案由多个线程有效地访问,我定义了以下内容;
ConcurrentSkipListMap<key, ConcurrentSkipListSet<values>>
我的问题是当值集大小为 0 时删除键是否需要同步?我知道这两个类是“并发的”,并且我已经查看了 OpenJDK 源代码,但是在一个线程 T1 检查 Set 是否为空并在 remove(...) 中删除 Map 之间似乎有一个窗口另一个线程 T2 调用 add(...)。结果是 T1 删除了最后一个 Set 条目并删除了与 T2 交错的 Map,只需添加一个 Set 条目。因此 Map 和 T2 Set 条目被 T1 删除,数据丢失。
我只是“同步” add() 和 remove() 方法还是有“更好”的方法?
Map由多个线程修改,但仅通过两种方法。
代码片段如下;
protected static class EndpointSet extends U4ConcurrentSkipListSet<U4Endpoint> {
private static final long serialVersionUID = 1L;
public EndpointSet() {
super();
}
}
protected static class IDToEndpoint extends U4ConcurrentSkipListMap<String, EndpointSet> {
private static final long serialVersionUID = 1L;
protected Boolean add(String id, U4Endpoint endpoint) {
EndpointSet endpoints = get(id);
if (endpoints == null) {
endpoints = new EndpointSet();
put(id, endpoints);
}
endpoints.add(endpoint);
return true;
}
protected Boolean remove(String id, U4Endpoint endpoint) {
EndpointSet endpoints = get(id);
if (endpoints == null) {
return false;
} else {
endpoints.remove(endpoint);
if (endpoints.size() == 0) {
remove(id);
}
return true;
}
}
}