欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Redisson分布式閉鎖RCountDownLatch的使用詳細(xì)講解

 更新時間:2023年02月11日 11:04:12   作者:每天都要進(jìn)步一點點  
分布式鎖和我們java基礎(chǔ)中學(xué)習(xí)到的synchronized略有不同,synchronized中我們的鎖是個對象,當(dāng)前系統(tǒng)部署在不同的服務(wù)實例上,單純使用synchronized或者lock已經(jīng)無法滿足對庫存一致性的判斷。本次主要講解基于rediss實現(xiàn)的分布式鎖

本篇文章基于redisson-3.17.6版本源碼進(jìn)行分析

一、RCountDownLatch的使用

RCountDownLatch的功能跟CountDownLatch,用于實現(xiàn)某個線程需要等待其他線程都完成之后,我再去執(zhí)行,這種場景就可以使用CountDownLatch。

@Test
public void testRCountDownLatch() {
    Config config = new Config();
    config.useSingleServer().setAddress("redis://127.0.0.1:6379");
    RedissonClient redissonClient = Redisson.create(config);
    RCountDownLatch rCountDownLatch = redissonClient.getCountDownLatch("anyCountDownLatch");
    rCountDownLatch.trySetCount(5);
    for (int i = 1; i <= 5; i++) {
        new Thread(() -> {
            System.out.println(Thread.currentThread().getName() + "離開教師...");
            rCountDownLatch.countDown();
        }, "A" + i).start();
    }
    try {
        rCountDownLatch.await();
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }
    System.out.println("班長鎖門...");
}

A1離開教師...
A2離開教師...
A4離開教師...
A3離開教師...
A5離開教師...
班長鎖門...

二、trySetCount()設(shè)置計數(shù)器

/**
 * 僅當(dāng)先前的計數(shù)已達(dá)到零或根本未設(shè)置時才設(shè)置新的計數(shù)值。
 */
boolean trySetCount(long count);
public RFuture<Boolean> trySetCountAsync(long count) {
    return commandExecutor.evalWriteAsync(getRawName(), LongCodec.INSTANCE, RedisCommands.EVAL_BOOLEAN,
            // 往redis中寫入一個String類型的數(shù)據(jù)    anyCountDownLatch:5
            "if redis.call('exists', KEYS[1]) == 0 then "
                + "redis.call('set', KEYS[1], ARGV[2]); "
                + "redis.call('publish', KEYS[2], ARGV[1]); "
                + "return 1 "
            + "else "
                + "return 0 "
            + "end",
            Arrays.asList(getRawName(), getChannelName()), CountDownLatchPubSub.NEW_COUNT_MESSAGE, count);
}

同樣,在redis中寫入了一個{key}:{計數(shù)器總數(shù)}的String類型的數(shù)據(jù)。

三、countDown()源碼

減少鎖存器的計數(shù)器。當(dāng)計數(shù)達(dá)到零時通知所有等待線程。

public RFuture<Void> countDownAsync() {
    return commandExecutor.evalWriteNoRetryAsync(getRawName(), LongCodec.INSTANCE, RedisCommands.EVAL_BOOLEAN,
                    // 減少redis中計數(shù)器的值
                    "local v = redis.call('decr', KEYS[1]);" +
                    // 計數(shù)器減為0后,刪除對應(yīng)的key        
                    "if v <= 0 then redis.call('del', KEYS[1]) end;" +
                    "if v == 0 then redis.call('publish', KEYS[2], ARGV[1]) end;",
                Arrays.<Object>asList(getRawName(), getChannelName()), CountDownLatchPubSub.ZERO_COUNT_MESSAGE);
}

四、await()源碼

等到計數(shù)器達(dá)到零。

public void await() throws InterruptedException {
    // 如果計數(shù)器為0,直接返回
    if (getCount() == 0) {
        return;
    }
    // 訂閱redisson_countdownlatch__channel__{anyCountDownLatch}的消息
    CompletableFuture<RedissonCountDownLatchEntry> future = subscribe();
    RedissonCountDownLatchEntry entry = commandExecutor.getInterrupted(future);
    try {
        // 不斷循環(huán)判斷計數(shù)器的值是否大于0,大于0說明還有線程沒執(zhí)行完成,在這里阻塞:LockSupport.park(this)
        while (getCount() > 0) {
            // waiting for open state
            entry.getLatch().await();
        }
    } finally {
        unsubscribe(entry);
    }
}

到此這篇關(guān)于Redisson分布式閉鎖RCountDownLatch的使用詳細(xì)講解的文章就介紹到這了,更多相關(guān)Redisson RCountDownLatch內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Netty核心功能之?dāng)?shù)據(jù)容器ByteBuf詳解

    Netty核心功能之?dāng)?shù)據(jù)容器ByteBuf詳解

    這篇文章主要為大家介紹了Netty核心功能之?dāng)?shù)據(jù)容器ByteBuf詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • Java文件操作實例詳解

    Java文件操作實例詳解

    這篇文章主要為大家詳細(xì)介紹了Java文件操作實例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • 關(guān)于網(wǎng)頁報錯404原因以及解決方法

    關(guān)于網(wǎng)頁報錯404原因以及解決方法

    404錯誤是網(wǎng)站常見的錯誤之一,出現(xiàn)的原因很多,解決方法也有很多種,這篇文章主要給大家介紹了關(guān)于網(wǎng)頁報錯404原因以及解決方法的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • SpringMVC實現(xiàn)文件下載功能

    SpringMVC實現(xiàn)文件下載功能

    這篇文章主要為大家詳細(xì)介紹了SpringMVC實現(xiàn)文件下載功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • JAVA內(nèi)存空間相關(guān)知識匯總

    JAVA內(nèi)存空間相關(guān)知識匯總

    這篇文章主要介紹了JAVA內(nèi)存空間相關(guān)知識,文中介紹的非常詳細(xì),代碼幫助大家更好的參考和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • Nacos配置文件使用經(jīng)驗及CAP原則詳解

    Nacos配置文件使用經(jīng)驗及CAP原則詳解

    這篇文章主要為大家介紹了Nacos配置文件使用經(jīng)驗及CAP規(guī)則詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-02-02
  • Java實現(xiàn)非阻塞式服務(wù)器的示例代碼

    Java實現(xiàn)非阻塞式服務(wù)器的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用Java實現(xiàn)一個簡單的非阻塞式服務(wù)器,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,需要的可以參考一下
    2023-05-05
  • Java基于分治法實現(xiàn)的快速排序算法示例

    Java基于分治法實現(xiàn)的快速排序算法示例

    這篇文章主要介紹了Java基于分治法實現(xiàn)的快速排序算法,結(jié)合實例形式分析了java基于分治法的快速排序相關(guān)實現(xiàn)技巧,代碼中備有較為詳細(xì)的注釋說明便于理解,需要的朋友可以參考下
    2017-12-12
  • Spring多數(shù)據(jù)源切換失敗,發(fā)現(xiàn)與事務(wù)相關(guān)問題

    Spring多數(shù)據(jù)源切換失敗,發(fā)現(xiàn)與事務(wù)相關(guān)問題

    這篇文章主要介紹了Spring多數(shù)據(jù)源切換失敗,發(fā)現(xiàn)與事務(wù)相關(guān)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 關(guān)于JVM默認(rèn)堆內(nèi)存大小問題

    關(guān)于JVM默認(rèn)堆內(nèi)存大小問題

    這篇文章主要介紹了關(guān)于JVM默認(rèn)堆內(nèi)存大小問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02

最新評論