最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中函數(shù)式接口實現(xiàn)分布式鎖

 更新時間:2026年02月18日 09:15:20   作者:9號達人  
本文介紹了一種使用函數(shù)式接口實現(xiàn)分布式鎖模板的方法,通過定義一個只包含一個抽象方法的接口來簡化加鎖邏輯,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

背景

最近使用分布式鎖比較多,發(fā)現(xiàn)大家使用分布式鎖,都各有各的用法,想著用搞一個加鎖模板,方便大家使用,就選擇聲明一個函數(shù)式接口,去實現(xiàn)加鎖的模板

函數(shù)式接口

是一種特殊的接口,只包含一個抽象方法。函數(shù)式接口的目的是為了支持函數(shù)式編程,使開發(fā)者能夠以更簡潔的方式定義單一抽象方法的接口,從而可以使用Lambda表達式來實現(xiàn)這個接口的抽象方法??梢酝ㄟ^lambda表達式進行傳遞,簡單理解就是java8對函數(shù)式編程的一種支持

實戰(zhàn)

我們一般加鎖是這樣,嘗試獲取鎖,失敗則拋異常,成功則執(zhí)行業(yè)務(wù)代碼,每次都要寫一大段邏輯

 RLock lock = redissonClient.getLock(lockKey);
        try {
            if (!lock.tryLock(waitTime, leaseTime, unit)) {
                throw new CommonException(ErrorCodeEnum.TRY_LOCK_ERROR).detailMessage("操作頻繁,請稍后再試!");
            }
            。。。。業(yè)務(wù)代碼
        }catch (CommonException commonException) {
        } catch (Exception e) {
            log.error("LockTemplate >>  獲取鎖異常",e);
        } finally {
            try {
                // 鎖不為空  是否還是鎖定狀態(tài)  當(dāng)前執(zhí)行線程的鎖
                if (lock != null && lock.isLocked() && lock.isHeldByCurrentThread()) {
                    lock.unlock();
                }
            } catch (Exception e) {
                log.error("LockTemplate >>  獲取鎖異常",e);
            }
        }
    }

所以可以采用函數(shù)是接口,定義一套加鎖模板,開發(fā)者就可以只關(guān)注業(yè)務(wù)代碼,而不用去寫一大段加鎖邏輯,

package com.dept.common.template;

import cn.hutool.core.util.StrUtil;
import com.dept.common.enums.ErrorCodeEnum;
import com.dept.common.exception.CommonException;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;

@Service
@AllArgsConstructor
@Slf4j
public class LockTemplate {

    private RedissonClient redissonClient;
    public void templateLock(String prefix,String key,Runnable target,long waitTime, long leaseTime, TimeUnit unit) {
        String lockKey = StrUtil.format(prefix,key);
        // 判斷是否正在使用
        RLock lock = redissonClient.getLock(lockKey);
        try {
            if (!lock.tryLock(waitTime, leaseTime, unit)) {
                throw new CommonException(ErrorCodeEnum.TRY_LOCK_ERROR).detailMessage("操作頻繁,請稍后再試!");
            }
			// 執(zhí)行業(yè)務(wù)代碼
            target.run();
        }catch (CommonException e){
            throw e;
        } catch (Exception e) {
            log.error("LockTemplate >>  獲取鎖異常",e);
        } finally {
            try {
                // 鎖不為空  是否還是鎖定狀態(tài)  當(dāng)前執(zhí)行線程的鎖
                if (lock != null && lock.isLocked() && lock.isHeldByCurrentThread()) {
                    lock.unlock();
                }
            } catch (Exception e) {
                log.error("LockTemplate >>  獲取鎖異常",e);
            }
        }
    }
}

重點就是將Runnable做為入?yún)?,Runnable是一個函數(shù)式接口,所以我們可以直接傳入業(yè)務(wù)實現(xiàn),當(dāng)然我們也可以自己定義一個函數(shù)式接口

  lockTemplate.templateLock(SystemConstants.STAR_TASK_MINA_ORDER_LOCK, order.getOrderSn(), () -> {
           。。。業(yè)務(wù)實現(xiàn)
        }, RedisConstants.ONE_SECOND, RedisConstants.TEN_SECOND, TimeUnit.MINUTES);

這樣我們就可以不用去關(guān)注加鎖邏輯,只需要寫自己的業(yè)務(wù)代碼接口

總結(jié)

通過函數(shù)式接口,我們可以定義很多模板代碼,讓開發(fā)者只需要傳入對應(yīng)的業(yè)務(wù)實現(xiàn)即可,TransactionTemplate的execute的方法也是類似的實現(xiàn)

到此這篇關(guān)于Java中函數(shù)式接口實現(xiàn)分布式鎖的文章就介紹到這了,更多相關(guān)Java 分布式鎖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java中的return關(guān)鍵字使用解讀

    java中的return關(guān)鍵字使用解讀

    這篇文章主要介紹了java中的return關(guān)鍵字使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 通過Java實現(xiàn)帶干擾線的驗證碼

    通過Java實現(xiàn)帶干擾線的驗證碼

    帶干擾線的驗證碼是一種常見的安全驗證方式,目的是通過圖像中的干擾線增加機器識別的難度,確保只有人類用戶能夠順利識別并輸入驗證碼,本項目的目的是通過Java實現(xiàn)一個帶有干擾線的驗證碼生成器,需要的朋友可以參考下
    2025-02-02
  • Java文件上傳與文件下載實現(xiàn)方法詳解

    Java文件上傳與文件下載實現(xiàn)方法詳解

    這篇文章主要介紹了Java文件上傳與文件下載實現(xiàn)方法,結(jié)合實例形式詳細(xì)分析了Java文件上傳與文件下載相關(guān)操作原理、實現(xiàn)方法及相關(guān)操作注意事項,需要的朋友可以參考下
    2019-02-02
  • SpringMVC生成的驗證碼圖片不顯示問題及解決方法

    SpringMVC生成的驗證碼圖片不顯示問題及解決方法

    這篇文章主要介紹了SpringMVC生成的驗證碼圖片不顯示問題,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • 基于java實現(xiàn)websocket代碼示例

    基于java實現(xiàn)websocket代碼示例

    這篇文章主要介紹了基于java實現(xiàn)websocket代碼示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-12-12
  • Spring配置文件超詳細(xì)講解

    Spring配置文件超詳細(xì)講解

    這篇文章主要介紹了Spring配置文件超的相關(guān)資料,配置文件是一種存放應(yīng)用程序或系統(tǒng)配置的文件,允許開發(fā)者和用戶在不修改代碼的情況下調(diào)整應(yīng)用程序的行為和性能,
    2025-03-03
  • SpringBoot使用TraceId進行日志鏈路追蹤的實現(xiàn)步驟

    SpringBoot使用TraceId進行日志鏈路追蹤的實現(xiàn)步驟

    有時候一個業(yè)務(wù)調(diào)用鏈場景,很長,調(diào)了各種各樣的方法,看日志的時候,各個接口的日志穿插,確實讓人頭大,所以為了解決這個問題,本文給大家介紹了SpringBoot使用TraceId進行日志鏈路追蹤的實現(xiàn)步驟,需要的朋友可以參考下
    2024-11-11
  • Maven項目如何查找jar包是由哪個依賴引入的

    Maven項目如何查找jar包是由哪個依賴引入的

    這篇文章主要介紹了Maven項目如何查找jar包是由哪個依賴引入的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Java?常見排序算法代碼分享

    Java?常見排序算法代碼分享

    這篇文章主要介紹了Java?常見排序算法代碼分享,文章通過分享詳細(xì)的代碼總結(jié)文章內(nèi)容,具有一定的參考價值,需要的小伙伴可以參考一下,希望對你有所幫助
    2022-03-03
  • SpringBoot實現(xiàn)攔截Http請求并設(shè)置請求頭

    SpringBoot實現(xiàn)攔截Http請求并設(shè)置請求頭

    這篇文章主要為大家詳細(xì)介紹了如何使用SpringBoot實現(xiàn)攔截Http請求并設(shè)置請求頭,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2026-01-01

最新評論

呼伦贝尔市| 平潭县| 秦皇岛市| 潞城市| 新晃| 读书| 沭阳县| 大兴区| 开封县| 昔阳县| 巴林左旗| 茶陵县| 和政县| 井研县| 虎林市| 元谋县| 游戏| 荣成市| 姜堰市| 肃宁县| 黔西县| 丰都县| 汤阴县| 绥化市| 南召县| 革吉县| 汝城县| 肥东县| 响水县| 横峰县| 阳信县| 平湖市| 泽普县| 永泰县| 双柏县| 依兰县| 自治县| 湘西| 淳安县| 湖州市| 茶陵县|