需求:兩個頁面先後呼叫同一方法,但業務邏輯要求全局僅執行一次。這通常是設計錯誤的徵兆,應先釐清業務語境再決定技術方案。
public class OnceService {
private static OnceService instance = new OnceService();
private boolean executed = false;
private OnceService() {}
public static OnceService getInstance() { return instance; }
public synchronized void doOnce() {
if (executed) return;
// 核心邏輯
executed = true;
}
}
public void doOnce() {
File flag = new File("/tmp/once.flag");
if (flag.exists()) return;
// 核心邏輯
flag.createNewFile(); // 原子性建立
}
若邏輯屬於初始化類,直接在 Bean 初始化或 Web 容器啟動時執行,避免頁面觸發。
@Transactional 保證資料一致性。@Scheduled 或 Quartz。核心原則:不要在頁面層控制執行次數,交給服務層或基礎設施層管理。