gpt4 book ai didi

java - 应该使用哪个 - ConcurrentHashMap putIfAbsent 或锁定映射

转载 作者:行者123 更新时间:2023-11-30 08:16:00 26 4
gpt4 key购买 nike

我有一种情况,调用者希望根据当前实例(标识符)获取 bean 的对象。现在,如果当前实例存在 bean 对象,则不应再次创建它。所以有两种方法(我认为)可以做到这一点 -

1. Using putIfAbsent of ConcurrentHashMap

beanObject = objectFactory.get(); // this will create new instance every time
// even if not required
beanObject = beanMapForInstance.putIfAbsent(name, beanObject);
return beanObject;

或者

2. By Locking the map

beanObject = beanMapForInstance.get(name); // beanMapForInstance is a ConcurrentHashMap
if(beanObject == null){
synchronized (beanMapForInstance) {
beanObject = beanMapForInstance.get(name);
if(beanObject == null){
beanObject = objectFactory.getObject();
beanMapForInstance.put(name, beanObject);
}
}
}
return beanObject;

在第一种方法中,每次都会创建新对象,因此我认为应该首选第二种方法。但是 findbugs 显示了在 ConcurrentHashMap 上执行同步的第二个选项存在问题,那么应该使用哪一个呢?

最佳答案

就您而言,别无选择:您无法锁定 ConcurrentHashMap。更准确地说,锁定 ConcurrentHashMap 无法按您的预期工作。它不会使您的操作成为线程安全的,因为 ConcurrentHashMap 中的线程安全操作不是通过同步对象本身来实现的。

引自Javadoc of ConcurrentHashMap :

This class is fully interoperable with Hashtable in programs that rely on its thread safety but not on its synchronization details

如果您不想不必要地创建值,那么您可以使用 computeIfAbsent(如果您使用的是 JDK 8+),这样您就可以延迟实例化,直到真正需要它为止。

关于java - 应该使用哪个 - ConcurrentHashMap putIfAbsent 或锁定映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29667393/

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