我正在尝试拥有一个可以按键和值排序的集合,但允许以原子方式更新/递增值。您只能在与ConcurrentHashMap的按键顺序,所以我试图用一个ConcurrentSkipListSet,但它不支持的putIfAbsent和替换(键,OLDVALUE,NEWVALUE)像ConcurrentHashMap的这样做,我不是很确定如何更新/与原子icrement值设置集合。
继承我用于ConcurrentSkipListSet的比较器
它应该在第一个字符串上排序,然后在第二个字符串
上的值上排序Comparator<Fun.Tuple3<String,String,Integer>> c = new Comparator<Fun.Tuple3<String,String,Integer>>() {
@Override
public int compare(Tuple3<String, String, Integer> o1, Tuple3<String, String, Integer> o2) {
if(o1.a.compareTo(o2.a) == 0){
if(Integer.compare(o1.c,o2.c)==0){
return o1.b.compareTo(o2.b);
}
return Integer.compare(o1.c,o2.c);
}
return o1.a.compareTo(o2.a);
}
};
不幸的是我不能结合两个字符串在一起以形成一个单一的键,因为我需要执行的查询,例如“匹配第一串,任何第二字符串,任何值”和有结果由比较有序的上面,我可以做套装。但是,如果我需要更新元组,我首先需要使用
获取旧值OldValue = Set.ceiling(new Fun.Tuple3<>(String,String,Integer.MinValue))
然后从集合中删除元素,然后将整数递增1并再次将其添加到集合中。问题是在Set.ceiling,remomve和add调用之间,该值可能已由另一个线程添加/删除/更改。
没有像&gt;
这样的方法AtomicIncrement(Tuple3 tuple3){
oldValue = Set.ceiling(tuple3)
while(true){
if(set.replace(oldValue,newValue)) return;
}
}
我没看到如何安全地更新价值。