Я в значительной степени использовал решение @ Asaf, однако я немного усовершенствовал его, чтобы сохранить и операции удаления:
class ConcurrentInsertionOrderSet extends ConcurrentSkipListSet{
Map<Object, Integer> orderMap;
final AtomicInteger increment = new AtomicInteger();
public ConcurrentInsertionOrderSet(final Map<Object, Integer> orderMap) {
super(new Comparator<Object>() {
public int compare(Object o1, Object o2) {
return (orderMap.get(o1).compareTo(orderMap.get(o2)));
}
});
this.orderMap = orderMap;
}
@Override
public boolean add(Object o) {
if (!orderMap.containsKey(o))
orderMap.put(o, increment.incrementAndGet());
return super.add(o);
}
@Override
public boolean remove(Object o) {
boolean b = super.remove(o);
if(b)
orderMap.remove(o);
return b;
}
}
И для теста:
public static void main(String[] str){
ConcurrentSkipListSet set = new ConcurrentInsertionOrderSet(new ConcurrentHashMap());
set.add("d");
set.add("b");
set.add("a");
set.add("c");
set.add("b");
set.add("c");
set.add("g");
System.out.println(set);
set.remove("b");
System.out.println(set);
set.remove("c");
set.add("c");
System.out.println(set);
}
Вывод хороший и последовательный:
[д, б, а, с, г]
[д, а, с, г]
[д, а, г, с]
Но я полагаю, что беспокойство @ axel22 по поводу состояния гонки сохраняется.