我有一个多线程应用程序。多个线程将事物放入Map中,其中每个事物必须具有唯一ID。现在我为此目的使用TreeMap,如下所示:
TreeMap<Integer, Thing> things = new TreeMap<>();
things.put(things.isEmpty() ? 0 : things.lastKey() + 1, thing);
但是TreeMap不是线程安全的,所以我决定用ConcurrentHashMap替换它。
但是如何使用HashMap实现相同的目标呢?那么如何为我投入的每件事生成一个新的唯一键呢?
答案 0 :(得分:2)
您可以使用Javas AtomicInteger类生成唯一的整数。它有一个线程安全的getAndIncrement()方法用于此目的。
但是,即使使用不同的密钥,这也可能会导致HashMap中出现一些不可预测的错误。此处列出了一些示例:Is a HashMap thread-safe for different keys?
因此,请务必使用线程安全映射或其他更快速的线程安全数据结构(如Vector)。如果您知道将添加多少元素的上限,则使用具有AtomicInteger索引的数组将是最快的,因为您可以避免所有同步。
答案 1 :(得分:1)
你可以这样写(某事):
Map<Integer, Integer> map = new ConcurrentHashMap<>();
AtomicInteger ai = new AtomicInteger(-1);
map.compute(x, (l, r) -> {
return ai.incrementAndGet();
})
compute
被记录为原子
答案 2 :(得分:0)
考虑使用UUID
作为密钥,extremely unlikely将发生冲突。像这样:
// import java.util.UUID;
UUID uuid = UUID.randomUUID();
String randomUUIDString = uuid.toString();