Мне удалось найти подходящую структуру на основе ConcurrentNavigableMap:
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentNavigableMap;
import java.util.concurrent.ConcurrentSkipListMap;
import java.util.concurrent.atomic.AtomicLong;
public class Journal<T> {
private static final long INITIAL_OFFSET = 0;
private AtomicLong nextOffset = new AtomicLong();
private ConcurrentNavigableMap<Long, T> messages = new ConcurrentSkipListMap<>();
public long append(T message) {
Long offset = nextOffset.getAndIncrement();
messages.put(offset, message);
return offset;
}
public long getFirstOffset() {
Iterator<Long> it = messages.keySet().iterator();
return it.hasNext() ? it.next() : INITIAL_OFFSET;
}
public Entry<Long, T> getNext(long offset) {
return this.messages.higherEntry(offset);
}
}