- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个非常简单的类(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/
我想在我公司的 Intranet 中,在 Internet 上放置一个 Web 服务,以使合作伙伴能够访问该 Web 服务提供的信息。 目前,Web 服务位于 SOA 中,我决定将所有内容都迁移到 R
是the Scribe OAuth library (用Java编写)支持3足OAuth ? 这里有人说它只适用于两条腿: How do I use OAuth within my GWT appli
在 React 中使用 Redux 进行 OAuth2 身份验证的可接受方法是什么? 我当前的设置涉及使用 Redux-Auth-Wrapper 包装 react 路由器组件,如果用户未经过身份验证,
OAuth 1.0a 凭证需要以明文形式(或以明文形式检索的方式)存储在服务器上,至少在进行 2 腿身份验证时,我是否正确?假设您使用的是 HTTPS 或其他 TLS,这不是比使用用户名和加盐 + 哈
我是一名优秀的程序员,十分优秀!