ConcurentCollection按键和值排序项目,同时以原子方式更新值

时间:2013-05-06 15:30:57

标签: java concurrency set

我正在尝试拥有一个可以按键和值排序的集合,但允许以原子方式更新/递增值。您只能在与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;
 }
}

我没看到如何安全地更新价值。

0 个答案:

没有答案