From d0094e43b5172839c2a918cdcfa622ad2fcdb508 Mon Sep 17 00:00:00 2001 From: Looly Date: Tue, 26 Aug 2025 16:19:57 +0800 Subject: [PATCH] =?UTF-8?q?`ReentrantCache`=E4=BF=AE=E6=94=B9get=E9=80=BB?= =?UTF-8?q?=E8=BE=91key=E9=94=81=E6=94=B9=E4=B8=BA=E5=85=A8=E5=B1=80?= =?UTF-8?q?=E9=94=81=EF=BC=8C=E4=BF=9D=E8=AF=81=E5=AE=89=E5=85=A8=E3=80=82?= =?UTF-8?q?=EF=BC=88issue#4022@Github=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 2 +- .../cn/hutool/cache/impl/ReentrantCache.java | 21 +------------------ 2 files changed, 2 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e98e173a5..155fd93aa9 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,7 +22,7 @@ * 【extra 】 修复`QLExpressEngine`allowClassSet无效问题(issue#3994@Github) * 【core 】 修复`StrBuilder`insert插入计算错误问题(issue#ICTSRZ@Gitee) * 【cron 】 修复`CronPatternUtil.nextDateAfter`计算下一个匹配表达式的日期时,计算错误问题(issue#4006@Github) -* 【cache 】 `ReentrantCache`增加`setUseKeyLock`让用户选择是否使用键锁来增强性能,或者保证安全。(issue#4022@Github) +* 【cache 】 `ReentrantCache`修改get逻辑key锁改为全局锁,保证安全。(issue#4022@Github) ------------------------------------------------------------------------------------------------------------- # 5.8.39(2025-06-20) 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 5f6a6b9a89..4c87bdf798 100755 --- a/hutool-cache/src/main/java/cn/hutool/cache/impl/ReentrantCache.java +++ b/hutool-cache/src/main/java/cn/hutool/cache/impl/ReentrantCache.java @@ -25,20 +25,6 @@ public abstract class ReentrantCache extends AbstractCache { // TODO 最优的解决方案是使用Guava的ConcurrentLinkedHashMap,此处使用简化的互斥锁 protected final ReentrantLock lock = new ReentrantLock(); - private boolean useKeyLock = true; - - /** - * 设置是否使用key锁,默认为true - * - * @param useKeyLock 是否使用key锁 - * @return this - * @since 5.8.40 - */ - public ReentrantCache setUseKeyLock(boolean useKeyLock) { - this.useKeyLock = useKeyLock; - return this; - } - @Override public void put(K key, V object, long timeout) { lock.lock(); @@ -61,11 +47,6 @@ public abstract class ReentrantCache extends AbstractCache { @Override public V get(final K key, final boolean isUpdateLastAccess, final long timeout, final Func0 valueFactory) { - if(useKeyLock){ - // 用户如果允许,则使用key锁,可以减少valueFactory对象创建造成的 - return super.get(key, isUpdateLastAccess, timeout, valueFactory); - } - V v = get(key, isUpdateLastAccess); // 对象不存在,则加锁创建 @@ -80,7 +61,7 @@ public abstract class ReentrantCache extends AbstractCache { if (null == co) { // supplier的创建是一个耗时过程,此处创建与全局锁无关,而与key锁相关,这样就保证每个key只创建一个value,且互斥 v = valueFactory.callWithRuntimeException(); - put(key, v, timeout); + putWithoutLock(key, v, timeout); } } finally { lock.unlock();