diff --git a/CHANGELOG.md b/CHANGELOG.md index c9f5c110a..1566a4239 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ * 【core 】 GenericBuilder支持Map构建(pr#540@Github) ### 🐞Bug修复 +* 【cache 】 修复ReentrantCache.toString方法线程不安全问题(issue#2140@Github) ------------------------------------------------------------------------------------------------------------- # 5.7.21 (2022-02-14) diff --git a/hutool-cache/src/main/java/cn/hutool/cache/impl/ReentrantCache.java b/hutool-cache/src/main/java/cn/hutool/cache/impl/ReentrantCache.java index 180bc7785..a985ad70b 100644 --- a/hutool-cache/src/main/java/cn/hutool/cache/impl/ReentrantCache.java +++ b/hutool-cache/src/main/java/cn/hutool/cache/impl/ReentrantCache.java @@ -18,7 +18,7 @@ public abstract class ReentrantCache extends AbstractCache { private static final long serialVersionUID = 1L; // 一些特殊缓存,例如使用了LinkedHashMap的缓存,由于get方法也会改变Map的结构,导致无法使用读写锁 - // 最优的解决方案是使用Guava的ConcurrentLinkedHashMap,此处使用简化的互斥锁 + // TODO 最优的解决方案是使用Guava的ConcurrentLinkedHashMap,此处使用简化的互斥锁 protected final ReentrantLock lock = new ReentrantLock(); @Override @@ -115,6 +115,16 @@ public abstract class ReentrantCache extends AbstractCache { } } + @Override + public String toString() { + lock.lock(); + try { + return super.toString(); + } finally { + lock.unlock(); + } + } + /** * 移除key对应的对象 *