java保證一個(gè)方法只能執(zhí)行一次的問題
java保證一個(gè)方法只能執(zhí)行一次
我們經(jīng)常會(huì)遇到一些情況需要某一個(gè)方法或者操作只執(zhí)行一次,比如說配置信息加載,如果配置信息需要?jiǎng)討B(tài)刷新,這個(gè)不在適用范圍。
下面列舉幾種方式
- 第一種 如果是web容器,可以使用servlet或者Listener
- 第二種 如果使用spring容器,則可以直接使用注解@PostConstruct
- 第三種 main直接執(zhí)行,可以寫在靜態(tài)代碼塊
static{ }
- 第四種 封裝成一個(gè)方法,使用AtomicBoolean來進(jìn)行判斷是否已執(zhí)行,或者使用同步鎖來保證原子性
java讓一個(gè)方法一分鐘只能被調(diào)用一次
可以使用 Java 中的計(jì)時(shí)器(Timer)和定時(shí)任務(wù)(TimerTask)配合使用實(shí)現(xiàn)一個(gè)每分鐘只能被調(diào)用一次的方法。
具體實(shí)現(xiàn)步驟如下
定義一個(gè)靜態(tài)變量
lastCalledTime
:用于保存上一次方法被調(diào)用的時(shí)間戳。
在方法中獲取當(dāng)前時(shí)間戳。
如果當(dāng)前時(shí)間戳與上一次調(diào)用時(shí)間戳之差小于一分鐘,則返回不執(zhí)行,否則執(zhí)行該方法并更新
lastCalledTime
:變量為當(dāng)前時(shí)間戳。
以下是示例代碼
public class MyClass { private static long lastCalledTime = 0; public synchronized void myMethod() { long currentTime = System.currentTimeMillis(); if (currentTime - lastCalledTime < 60000) { return; } // 執(zhí)行方法操作 lastCalledTime = currentTime; } }
這里使用了關(guān)鍵字 synchronized,確保多線程環(huán)境下僅有一個(gè)線程可以進(jìn)入 myMethod() 方法。
需要注意的是,如果方法執(zhí)行時(shí)間超過一分鐘,在調(diào)用間隔的限制下仍然可能會(huì)導(dǎo)致同時(shí)執(zhí)行的問題。
此外,由于計(jì)時(shí)器本身也會(huì)占用系統(tǒng)資源,如果過度濫用此方法限制,可能會(huì)影響應(yīng)用程序整體性能。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot導(dǎo)出Excel表格到指定路徑的代碼詳解
Spring Boot導(dǎo)出Excel通常涉及到使用第三方庫如Apache POI或者XlsxWriter等,它們能幫助你在Spring應(yīng)用中生成并下載Excel文件,那么SpringBoot如何導(dǎo)出Excel表格到指定路徑,本文將給大家詳細(xì)的介紹一下2024-07-07SpringBoot限制接口訪問頻率功能實(shí)現(xiàn)
最近在基于SpringBoot做一個(gè)面向普通用戶的系統(tǒng),為了保證系統(tǒng)的穩(wěn)定性,防止被惡意攻擊,我想控制用戶訪問每個(gè)接口的頻率,接下來通過本文給大家介紹SpringBoot限制接口訪問頻率功能實(shí)現(xiàn),需要的朋友可以參考下2023-05-05spring中的注解@@Transactional失效的場(chǎng)景代碼演示
這篇文章主要介紹了spring中的注解@@Transactional失效的場(chǎng)景代碼演示,@Transactional注解是Spring框架提供的用于聲明事務(wù)的注解,作用于類和方法上,需要的朋友可以參考下2024-01-01Spring Security和Shiro的相同點(diǎn)與不同點(diǎn)整理
在本篇文章里小編給大家整理的是關(guān)于Spring Security和Shiro的相同不同點(diǎn)整理,需要的朋友們可以參考下。2020-02-02