Java ConcurrentCollection按键和值排序项目,同时原子更新值
我正在尝试创建一个集合,该集合可以按键和值对入口进行排序,但允许以原子方式更新/增加值。您只能使用ConcurrentHashMap对键进行排序,因此我尝试使用ConcurrentSkipListSet,但它不支持像ConcurrentHashMap那样的putifabsent和replace(键、旧值、新值),因此我不太确定如何使用集合自动更新/替换值 这是我用于ConcurrentSkipListSet的比较器 它应该在第一个字符串上排序,然后在值上排序,然后在第二个字符串上排序Java ConcurrentCollection按键和值排序项目,同时原子更新值,java,concurrency,set,Java,Concurrency,Set,我正在尝试创建一个集合,该集合可以按键和值对入口进行排序,但允许以原子方式更新/增加值。您只能使用ConcurrentHashMap对键进行排序,因此我尝试使用ConcurrentSkipListSet,但它不支持像ConcurrentHashMap那样的putifabsent和replace(键、旧值、新值),因此我不太确定如何使用集合自动更新/替换值 这是我用于ConcurrentSkipListSet的比较器 它应该在第一个字符串上排序,然后在值上排序,然后在第二个字符串上排序 Compa
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);
}
};
我不知道如何安全地更新该值。如果您更改
集合
中元素的顺序(例如使用比较器),则没有集合
实现将继续工作。如果不从头开始创建一个完整的数据结构,我能想到的唯一真正的替代方法是使用同步的树集
,并在需要更新时删除旧值并在同步块中添加新值。(要明确的是,使用synchronizedTreeSet
可以做到这一点,但肯定没有内置的数据结构——可能根本没有任何数据结构——可以让您像尝试做的那样,以原子方式替换元素,而完全没有阻塞。)
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;
}
}