非同步的 WeakHashMap 有害吗?
Is a non-synchronized WeakHashMap harmful?
我有一个这样的代码。
private static Map<String, Pattern> PATTERNS;
private static Map<String, Pattern> patterns() {
if (PATTERNS == null) {
PATTERNS = new WeakHashMap<>(); // ok? or should be synchronized?
}
return PATTERNS;
}
// intending to reuse those pre-compiled patters
private static Pattern pattern(final String regex) {
return patterns().computeIfAbsent(
requireNonNull(regex, "regex is null"), Pattern::compile);
}
我已经知道 WeakHashMap
没有同步。我只是不关心 Pattern
s.
的多重构造
在多线程环境下,PATTERNS
是否应该同步?
Multi-threaded 使用 HashMap
会导致无限循环。 IIRC,并发重新散列可以使桶形成链。
一般来说,避免任何具有竞争条件的东西。也有例外,例如,不可变的缓存值。
还有:
表示值的类型,例如 String
,不适合用作 WeakHashMap
的键。
延迟初始化,超出了 JVM 免费提供的范围,通常是不值得的。在这种情况下,您可能最终得到两张地图并不特别重要。
Is a non-synchronized WeakHashMap harmful?
是的。您必须添加额外的保护才能跨线程使用 WeakHashMap
。
因此在 class Javadoc 中找到的建议:
A synchronized WeakHashMap
may be constructed using the Collections.synchronizedMap
method
PATTERNS = Collections.synchronized( new WeakHashMap<>() ) ;
参见 this Question。
我有一个这样的代码。
private static Map<String, Pattern> PATTERNS;
private static Map<String, Pattern> patterns() {
if (PATTERNS == null) {
PATTERNS = new WeakHashMap<>(); // ok? or should be synchronized?
}
return PATTERNS;
}
// intending to reuse those pre-compiled patters
private static Pattern pattern(final String regex) {
return patterns().computeIfAbsent(
requireNonNull(regex, "regex is null"), Pattern::compile);
}
我已经知道 WeakHashMap
没有同步。我只是不关心 Pattern
s.
在多线程环境下,PATTERNS
是否应该同步?
Multi-threaded 使用 HashMap
会导致无限循环。 IIRC,并发重新散列可以使桶形成链。
一般来说,避免任何具有竞争条件的东西。也有例外,例如,不可变的缓存值。
还有:
表示值的类型,例如 String
,不适合用作 WeakHashMap
的键。
延迟初始化,超出了 JVM 免费提供的范围,通常是不值得的。在这种情况下,您可能最终得到两张地图并不特别重要。
Is a non-synchronized WeakHashMap harmful?
是的。您必须添加额外的保护才能跨线程使用 WeakHashMap
。
因此在 class Javadoc 中找到的建议:
A synchronized
WeakHashMap
may be constructed using theCollections.synchronizedMap
method
PATTERNS = Collections.synchronized( new WeakHashMap<>() ) ;
参见 this Question。