2

我有一个看起来像这样的代码。

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不同步。我只是不关心Patterns 的多重构造。

如果PATTERNS是多线程环境,是否应该同步?

4

2 回答 2

2

s 的多线程使用HashMap会导致无限循环。IIRC,并发重新散列可以使存储桶形成一个链。

一般来说,避免任何有竞争条件的事情。也有例外,例如不可变的缓存值。

还:

表示值的类型,例如String,不是用作 键的好类型WeakHashMap

超出 JVM 免费提供的延迟初始化通常是不值得的。在这种情况下,您最终可能会得到两张地图并不特别重要。

于 2019-07-14T13:39:52.197 回答
2

非同步的 WeakHashMap 有害吗?

是的。您必须添加额外的保护才能WeakHashMap跨线程使用。

因此,在 Javadoc 类中找到的建议:

WeakHashMap可以使用该Collections.synchronizedMap方法构造同步的

PATTERNS = Collections.synchronized( new WeakHashMap<>() ) ;

看到这个问题

于 2019-07-14T15:25:45.943 回答