This commit is contained in:
Looly 2022-04-10 15:24:14 +08:00
parent 569877e0ef
commit f9a3cf7b23
4 changed files with 38 additions and 3 deletions

View File

@ -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时未使用读锁可能导致的问题
-------------------------------------------------------------------------------------------------------------

View File

@ -97,7 +97,7 @@ public class SimpleCache<K, V> implements Iterable<Map.Entry<K, V>>, Serializabl
keyLock.lock();
try {
// 双重检查防止在竞争锁的过程中已经有其它线程写入
v = cache.get(key);
v = get(key);
if (null == v || (null != validPredicate && false == validPredicate.test(v))) {
try {
v = supplier.call();

View File

@ -44,9 +44,9 @@ public class ReferenceUtil {
public static <T> Reference<T> create(ReferenceType type, T referent, ReferenceQueue<T> 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:

View File

@ -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<Integer> 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<Integer> 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<Integer> integerReference = ReferenceUtil.create(ReferenceUtil.ReferenceType.PHANTOM, 1);
Assert.assertTrue(integerReference instanceof PhantomReference);
// get方法永远都返回nullPhantomReference只能用来监控对象的GC状况
Assert.assertNull(integerReference.get());
}
}