Java ConcurrentCollection按键和值排序项目,同时原子更新值

Java ConcurrentCollection按键和值排序项目,同时原子更新值,java,concurrency,set,Java,Concurrency,Set,我正在尝试创建一个集合,该集合可以按键和值对入口进行排序,但允许以原子方式更新/增加值。您只能使用ConcurrentHashMap对键进行排序,因此我尝试使用ConcurrentSkipListSet,但它不支持像ConcurrentHashMap那样的putifabsent和replace(键、旧值、新值),因此我不太确定如何使用集合自动更新/替换值 这是我用于ConcurrentSkipListSet的比较器 它应该在第一个字符串上排序,然后在值上排序,然后在第二个字符串上排序 Compa

我正在尝试创建一个集合,该集合可以按键和值对入口进行排序,但允许以原子方式更新/增加值。您只能使用ConcurrentHashMap对键进行排序,因此我尝试使用ConcurrentSkipListSet,但它不支持像ConcurrentHashMap那样的putifabsent和replace(键、旧值、新值),因此我不太确定如何使用集合自动更新/替换值

这是我用于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);
 }
 };

我不知道如何安全地更新该值。

如果您更改
集合
中元素的顺序(例如使用
比较器),则没有
集合
实现将继续工作。如果不从头开始创建一个完整的数据结构,我能想到的唯一真正的替代方法是使用同步的
树集
,并在需要更新时删除旧值并在同步块中添加新值。(要明确的是,使用synchronized
TreeSet
可以做到这一点,但肯定没有内置的数据结构——可能根本没有任何数据结构——可以让您像尝试做的那样,以原子方式替换元素,而完全没有阻塞。)
OldValue = Set.ceiling(new Fun.Tuple3<>(String,String,Integer.MinValue))
AtomicIncrement(Tuple3 tuple3){
 oldValue = Set.ceiling(tuple3)
 while(true){
   if(set.replace(oldValue,newValue)) return;
 }
}