From c701dd8e6ef9e14abc4e714592d2edd18fb006ce Mon Sep 17 00:00:00 2001 From: godotg Date: Mon, 25 Mar 2024 19:57:48 +0800 Subject: [PATCH] fix[LazyCache]: ConcurrentHashMap unsafe remove in for --- orm/src/main/java/com/zfoo/orm/util/LazyCache.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/orm/src/main/java/com/zfoo/orm/util/LazyCache.java b/orm/src/main/java/com/zfoo/orm/util/LazyCache.java index 89d2d182..81d89e8d 100644 --- a/orm/src/main/java/com/zfoo/orm/util/LazyCache.java +++ b/orm/src/main/java/com/zfoo/orm/util/LazyCache.java @@ -3,6 +3,7 @@ package com.zfoo.orm.util; import com.zfoo.protocol.model.Pair; import com.zfoo.scheduler.util.TimeUtils; +import java.util.ArrayList; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.atomic.AtomicLong; @@ -149,15 +150,17 @@ public class LazyCache { if (expireCheckTimeAtomic.compareAndSet(expireCheckTime, now + expireCheckInterval)) { if (now > this.minExpireTime) { var minTimestamp = Long.MAX_VALUE; + var removeList = new ArrayList(); for (var entry : cacheMap.entrySet()) { var expireTime = entry.getValue().expireTime; if (expireTime < now) { - remove(entry.getKey(), RemovalCause.EXPIRED); + removeList.add(entry.getKey()); } if (expireTime < minTimestamp) { minTimestamp = expireTime; } } + removeList.forEach(it -> remove(it, RemovalCause.EXPIRED)); this.minExpireTime = minTimestamp; } }