From 4cc276e66500f8174b364fde9ed71fe14d7ccf5c Mon Sep 17 00:00:00 2001 From: Looly Date: Thu, 26 Nov 2020 13:58:26 +0800 Subject: [PATCH] add volitile --- CHANGELOG.md | 1 + .../cn/hutool/cache/impl/AbstractCache.java | 21 ++++++++++--------- .../java/cn/hutool/cache/impl/CacheObj.java | 7 ++++--- .../java/cn/hutool/cache/impl/LFUCache.java | 7 +++---- .../java/cn/hutool/core/date/DateUtil.java | 4 ++-- 5 files changed, 21 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1b8f26ddb..f10eb39e9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ * 【core 】 xml.setXmlStandalone(true)格式优化(pr#1234@Github) * 【core 】 AnnotationUtil增加setValue方法(pr#1250@Github) * 【core 】 ZipUtil增加get方法 +* 【cache 】 对CacheObj等变量使用volatile关键字 ### Bug修复 * 【cron 】 修复CronTimer可能死循环的问题(issue#1224@Github) diff --git a/hutool-cache/src/main/java/cn/hutool/cache/impl/AbstractCache.java b/hutool-cache/src/main/java/cn/hutool/cache/impl/AbstractCache.java index f46009980..8888324f8 100644 --- a/hutool-cache/src/main/java/cn/hutool/cache/impl/AbstractCache.java +++ b/hutool-cache/src/main/java/cn/hutool/cache/impl/AbstractCache.java @@ -6,6 +6,7 @@ import cn.hutool.core.lang.func.Func0; import java.util.Iterator; import java.util.Map; +import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.locks.StampedLock; /** @@ -44,11 +45,11 @@ public abstract class AbstractCache implements Cache { /** * 命中数 */ - protected int hitCount; + protected AtomicLong hitCount; /** * 丢失数 */ - protected int missCount; + protected AtomicLong missCount; // ---------------------------------------------------------------- put start @Override @@ -113,15 +114,15 @@ public abstract class AbstractCache implements Cache { /** * @return 命中数 */ - public int getHitCount() { - return hitCount; + public long getHitCount() { + return hitCount.get(); } /** * @return 丢失数 */ - public int getMissCount() { - return missCount; + public long getMissCount() { + return missCount.get(); } @Override @@ -157,15 +158,15 @@ public abstract class AbstractCache implements Cache { // 不存在或已移除 final CacheObj co = cacheMap.get(key); if (null == co) { - missCount++; + missCount.getAndIncrement(); return null; } if (co.isExpired()) { - missCount++; + missCount.getAndIncrement(); } else{ // 命中 - hitCount++; + hitCount.getAndIncrement(); return co.get(isUpdateLastAccess); } } finally { @@ -318,7 +319,7 @@ public abstract class AbstractCache implements Cache { final CacheObj co = cacheMap.remove(key); if (withMissCount) { // 在丢失计数有效的情况下,移除一般为get时的超时操作,此处应该丢失数+1 - this.missCount++; + this.missCount.getAndIncrement(); } return co; } diff --git a/hutool-cache/src/main/java/cn/hutool/cache/impl/CacheObj.java b/hutool-cache/src/main/java/cn/hutool/cache/impl/CacheObj.java index 62a4cf2bd..fea9009dd 100644 --- a/hutool-cache/src/main/java/cn/hutool/cache/impl/CacheObj.java +++ b/hutool-cache/src/main/java/cn/hutool/cache/impl/CacheObj.java @@ -1,6 +1,7 @@ package cn.hutool.cache.impl; import java.io.Serializable; +import java.util.concurrent.atomic.AtomicLong; /** * 缓存对象 @@ -16,9 +17,9 @@ public class CacheObj implements Serializable{ protected final V obj; /** 上次访问时间 */ - private long lastAccess; + private volatile long lastAccess; /** 访问次数 */ - protected long accessCount; + protected AtomicLong accessCount; /** 对象存活时长,0表示永久存活*/ private final long ttl; @@ -61,7 +62,7 @@ public class CacheObj implements Serializable{ if(isUpdateLastAccess) { lastAccess = System.currentTimeMillis(); } - accessCount++; + accessCount.getAndIncrement(); return this.obj; } diff --git a/hutool-cache/src/main/java/cn/hutool/cache/impl/LFUCache.java b/hutool-cache/src/main/java/cn/hutool/cache/impl/LFUCache.java index 3b04b8f33..d06a0ef98 100644 --- a/hutool-cache/src/main/java/cn/hutool/cache/impl/LFUCache.java +++ b/hutool-cache/src/main/java/cn/hutool/cache/impl/LFUCache.java @@ -69,21 +69,20 @@ public class LFUCache extends AbstractCache { } //找出访问最少的对象 - if (comin == null || co.accessCount < comin.accessCount) { + if (comin == null || co.accessCount.get() < comin.accessCount.get()) { comin = co; } } // 减少所有对象访问量,并清除减少后为0的访问对象 if (isFull() && comin != null) { - long minAccessCount = comin.accessCount; + long minAccessCount = comin.accessCount.get(); values = cacheMap.values().iterator(); CacheObj co1; while (values.hasNext()) { co1 = values.next(); - co1.accessCount -= minAccessCount; - if (co1.accessCount <= 0) { + if (co1.accessCount.addAndGet(-minAccessCount) <= 0) { values.remove(); onRemove(co1.key, co1.obj); count++; diff --git a/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java b/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java index 5815c3632..365b42b0d 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java @@ -819,10 +819,10 @@ public class DateUtil extends CalendarUtil { int length = utcString.length(); if (StrUtil.contains(utcString, 'Z')) { if (length == DatePattern.UTC_PATTERN.length() - 4) { - // 格式类似:2018-09-13T05:34:31Z + // 格式类似:2018-09-13T05:34:31Z,-4表示减去4个单引号的长度 return parse(utcString, DatePattern.UTC_FORMAT); } else if (length == DatePattern.UTC_MS_PATTERN.length() - 4) { - // 格式类似:2018-09-13T05:34:31.999Z + // 格式类似:2018-09-13T05:34:31.999Z,-4表示减去4个单引号的长度 return parse(utcString, DatePattern.UTC_MS_FORMAT); } } else {