mirror of
https://gitee.com/dromara/hutool.git
synced 2025-04-05 17:37:59 +08:00
add volitile
This commit is contained in:
parent
994a7a49bf
commit
4cc276e665
@ -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)
|
||||
|
@ -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<K, V> implements Cache<K, V> {
|
||||
/**
|
||||
* 命中数
|
||||
*/
|
||||
protected int hitCount;
|
||||
protected AtomicLong hitCount;
|
||||
/**
|
||||
* 丢失数
|
||||
*/
|
||||
protected int missCount;
|
||||
protected AtomicLong missCount;
|
||||
|
||||
// ---------------------------------------------------------------- put start
|
||||
@Override
|
||||
@ -113,15 +114,15 @@ public abstract class AbstractCache<K, V> implements Cache<K, V> {
|
||||
/**
|
||||
* @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<K, V> implements Cache<K, V> {
|
||||
// 不存在或已移除
|
||||
final CacheObj<K, V> 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<K, V> implements Cache<K, V> {
|
||||
final CacheObj<K, V> co = cacheMap.remove(key);
|
||||
if (withMissCount) {
|
||||
// 在丢失计数有效的情况下,移除一般为get时的超时操作,此处应该丢失数+1
|
||||
this.missCount++;
|
||||
this.missCount.getAndIncrement();
|
||||
}
|
||||
return co;
|
||||
}
|
||||
|
@ -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<K, V> 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<K, V> implements Serializable{
|
||||
if(isUpdateLastAccess) {
|
||||
lastAccess = System.currentTimeMillis();
|
||||
}
|
||||
accessCount++;
|
||||
accessCount.getAndIncrement();
|
||||
return this.obj;
|
||||
}
|
||||
|
||||
|
@ -69,21 +69,20 @@ public class LFUCache<K, V> extends AbstractCache<K, V> {
|
||||
}
|
||||
|
||||
//找出访问最少的对象
|
||||
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<K, V> 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++;
|
||||
|
@ -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 {
|
||||
|
Loading…
Reference in New Issue
Block a user