java - 非同步的 WeakHashMap 有害吗?
问题描述
我有一个看起来像这样的代码。
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
是多线程环境,是否应该同步?
解决方案
s 的多线程使用HashMap
会导致无限循环。IIRC,并发重新散列可以使存储桶形成一个链。
一般来说,避免任何有竞争条件的事情。也有例外,例如不可变的缓存值。
还:
表示值的类型,例如String
,不是用作 键的好类型WeakHashMap
。
超出 JVM 免费提供的延迟初始化通常是不值得的。在这种情况下,您最终可能会得到两张地图并不特别重要。
推荐阅读
- ruby - 回溯中的数字是什么意思?
- flask - 在烧瓶 wtforms jinja select 上设置动态数据属性
- typeorm - 基于类型的 TypeORM 查询在表上左连接,而无需构建两个查询
- php - 无法在 Laravel 8 和 Breeze 注册路由中获取 Livewire 到 Fire 功能:提交
- javascript - Rollup UMD 输出格式不起作用,但是 ES 可以
- c# - Socket.ReceiveAsync 未调用 e.Completed 事件
- node.js - 打开 SSL3.0 - 使用节点 17.0
- javascript - “未处理的拒绝(错误):重新渲染太多......”因为我在循环中设置状态?
- tensorflow - 关于为 Google Magenta AI 音乐项目(DDSP 模块)创建或查找吉他预训练 wights
- php - SQLite3 LIMIT for UPDATE 和 DELETE 在 Windows 中的 PHP 上?