gpt4 book ai didi

java - Map 足以保证线程安全吗?

转载 作者:行者123 更新时间:2023-12-02 04:35:09 27 4
gpt4 key购买 nike

我有一个非常简单的类(class):

public class IdProvider {

private Map<String,AtomicLong> idMap;

public IdProvider(){
idMap = new HashMap<>();
}

public long getAvailableId(String conversation){
AtomicLong id = idMap.get(conversation);
if(id == null){
id = new AtomicLong(0);
idMap.put(conversation,id);
}
return id.getAndIncrement();
}


}

不同的异步方法可能会传递相同的 session 标识符并调用 getAvailableId(),它们将返回一个唯一 ID。

这个线程安全吗?我保证不会有两种方法收到相同的 id,还是我需要选择其他方法?

最佳答案

有多种方法可以使该线程安全,但我认为以下是最简单的方法。首先,您需要安全地发布初始 map 。然后您需要确保该映射线程的每次访问都是安全的。

public class IdProvider {

private final Map<String,AtomicLong> idMap;

public IdProvider(){
idMap = new HashMap<>();
}

public synchronized long getAvailableId(String conversation){
AtomicLong id = idMap.get(conversation);
if(id == null){
id = new AtomicLong(0);
idMap.put(conversation,id);
}
return id.getAndIncrement();
}


}

final 关键字是提供“安全发布”的一种方式。 (这是 Java 中的一个实际术语,请查一下。)

而且无需技巧,只需同步整个方法就是提供同步和原子性的最简单方法。除非您可以分析此代码并确定它实际上是性能瓶颈,否则您不应该尝试执行更多操作。保持简单。

关于java - Map<String,AtomicLong> 足以保证线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30926852/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com