我正在尝试实现一个线程安全的Map
缓存,我希望缓存的Strings
能够进行延迟初始化。这是我第一次尝试实现:
public class ExampleClass {
private static final Map<String, String> CACHED_STRINGS = new HashMap<String, String>();
public String getText(String key) {
String string = CACHED_STRINGS.get(key);
if (string == null) {
synchronized (CACHED_STRINGS) {
string = CACHED_STRINGS.get(key);
if (string == null) {
string = createString();
CACHED_STRINGS.put(key, string);
}
}
}
return string;
}
}
在编写这段代码后,Netbeans警告我关于“双重检查锁定”,所以我开始研究它。我发现了“双重检查锁定已经过时”声明并阅读了它,但我不确定我的实现是否会遭受它所提到的问题。看起来文章中提到的所有问题都与在
synchronized
块内使用new
运算符进行对象实例化有关。我没有使用new
运算符,并且字符串是不可变的,因此我不确定该文章是否与此情况相关。这是一种在线程安全的方式在HashMap
中缓存字符串吗?线程安全是否取决于createString()
方法中采取的操作?
ConcurrentHashMap
пЉЯ - Andy Turnerfinal
还是不是对线程安全没有影响? - stiemannkj1