我有个代码看起来像这样。
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的多个结构。
在多线程环境中,应该同步PATTERNS吗?
发布于 2019-07-14 15:25:45
非同步WeakHashMap有害吗?
是。必须添加其他保护才能跨线程使用WeakHashMap。
因此,Javadoc类中的建议如下:
可以使用
WeakHashMap方法构造同步Collections.synchronizedMap。
PATTERNS = Collections.synchronized( new WeakHashMap<>() ) ;发布于 2019-07-14 13:39:52
多线程使用HashMap会导致无限循环。同时重哈希可以使桶形成一个链。
一般来说,避免任何有种族条件的东西。例如,有一些异常,不可变的缓存值。
另外:
表示值的类型(如String )不是用作WeakHashMap键的好类型。
除了JVM提供的免费初始化之外,懒惰初始化通常不值得。在这种情况下,你可能会得到两张地图,这并不特别重要。
https://stackoverflow.com/questions/57027764
复制相似问题