From 14e4e55b63e6ba4b27f03a81464eab93054e22c9 Mon Sep 17 00:00:00 2001 From: godotg Date: Sun, 23 Feb 2025 18:30:23 +0800 Subject: [PATCH] feat[cache]: async lazyGet for SingleCache --- .../com/zfoo/scheduler/manager/SchedulerBus.java | 7 +++++++ .../java/com/zfoo/scheduler/util/SingleCache.java | 15 +++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/scheduler/src/main/java/com/zfoo/scheduler/manager/SchedulerBus.java b/scheduler/src/main/java/com/zfoo/scheduler/manager/SchedulerBus.java index 5420572f..630a3d3f 100644 --- a/scheduler/src/main/java/com/zfoo/scheduler/manager/SchedulerBus.java +++ b/scheduler/src/main/java/com/zfoo/scheduler/manager/SchedulerBus.java @@ -187,4 +187,11 @@ public abstract class SchedulerBus { registerScheduler(SchedulerDefinition.valueOf(cron, runnable)); } + /** + * 立刻执行的任务 + */ + public static void execute(Runnable runnable) { + executor.execute(ThreadUtils.safeRunnable(runnable)); + } + } diff --git a/scheduler/src/main/java/com/zfoo/scheduler/util/SingleCache.java b/scheduler/src/main/java/com/zfoo/scheduler/util/SingleCache.java index ead6d5c0..f30c3e08 100644 --- a/scheduler/src/main/java/com/zfoo/scheduler/util/SingleCache.java +++ b/scheduler/src/main/java/com/zfoo/scheduler/util/SingleCache.java @@ -13,6 +13,9 @@ package com.zfoo.scheduler.util; +import com.zfoo.scheduler.manager.SchedulerBus; + +import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; import java.util.function.Supplier; @@ -60,6 +63,18 @@ public class SingleCache { return cache; } + public V lazyGet() { + var now = TimeUtils.now(); + var refreshTime = refreshTimeAtomic.get(); + // 使用双重检测锁的方式 + if (now > refreshTime) { + if (refreshTimeAtomic.compareAndSet(refreshTime, now + refreshDuration)) { + SchedulerBus.execute(() -> cache = supplier.get()); + } + } + return cache; + } + public void set(V value) { cache = value; }