diff --git a/CHANGELOG.md b/CHANGELOG.md index b456514fd..9d9a21a83 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ * 【poi 】 修复ExcelWriter.getDisposition方法生成错误(issue#2239@Github) * 【core 】 修复UrlBuilder重复编码的问题(issue#2243@Github) * 【http 】 修复HttpRequest中urlQuery,处理get请求参数的时候会导致空指针异常(pr#2248@Github) +* 【core 】 修复SimpleCache在get时未使用读锁可能导致的问题 ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/SimpleCache.java b/hutool-core/src/main/java/cn/hutool/core/lang/SimpleCache.java index 35352451e..1afd648c5 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/SimpleCache.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/SimpleCache.java @@ -97,7 +97,7 @@ public class SimpleCache implements Iterable>, Serializabl keyLock.lock(); try { // 双重检查,防止在竞争锁的过程中已经有其它线程写入 - v = cache.get(key); + v = get(key); if (null == v || (null != validPredicate && false == validPredicate.test(v))) { try { v = supplier.call(); diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ReferenceUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ReferenceUtil.java index 5ba9b8e76..e4b13b6a6 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/ReferenceUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ReferenceUtil.java @@ -44,9 +44,9 @@ public class ReferenceUtil { public static Reference create(ReferenceType type, T referent, ReferenceQueue queue) { switch (type) { case SOFT: - return new SoftReference<>(referent); + return new SoftReference<>(referent, queue); case WEAK: - return new WeakReference<>(referent); + return new WeakReference<>(referent, queue); case PHANTOM: return new PhantomReference<>(referent, queue); default: diff --git a/hutool-core/src/test/java/cn/hutool/core/util/ReferenceUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/ReferenceUtilTest.java new file mode 100755 index 000000000..97fa55953 --- /dev/null +++ b/hutool-core/src/test/java/cn/hutool/core/util/ReferenceUtilTest.java @@ -0,0 +1,34 @@ +package cn.hutool.core.util; + +import org.junit.Assert; +import org.junit.Test; + +import java.lang.ref.PhantomReference; +import java.lang.ref.Reference; +import java.lang.ref.SoftReference; +import java.lang.ref.WeakReference; + +public class ReferenceUtilTest { + + @Test + public void createWeakTest(){ + final Reference integerReference = ReferenceUtil.create(ReferenceUtil.ReferenceType.WEAK, 1); + Assert.assertTrue(integerReference instanceof WeakReference); + Assert.assertEquals(new Integer(1), integerReference.get()); + } + + @Test + public void createSoftTest(){ + final Reference integerReference = ReferenceUtil.create(ReferenceUtil.ReferenceType.SOFT, 1); + Assert.assertTrue(integerReference instanceof SoftReference); + Assert.assertEquals(new Integer(1), integerReference.get()); + } + + @Test + public void createPhantomTest(){ + final Reference integerReference = ReferenceUtil.create(ReferenceUtil.ReferenceType.PHANTOM, 1); + Assert.assertTrue(integerReference instanceof PhantomReference); + // get方法永远都返回null,PhantomReference只能用来监控对象的GC状况 + Assert.assertNull(integerReference.get()); + } +}