91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Redisson分布式閉鎖RCountDownLatch如何使用

發布時間:2023-02-13 09:09:04 來源:億速云 閱讀:81 作者:iii 欄目:開發技術

這篇文章主要介紹了Redisson分布式閉鎖RCountDownLatch如何使用的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Redisson分布式閉鎖RCountDownLatch如何使用文章都會有所收獲,下面我們一起來看看吧。

一、RCountDownLatch的使用

RCountDownLatch的功能跟CountDownLatch,用于實現某個線程需要等待其他線程都完成之后,我再去執行,這種場景就可以使用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()設置計數器

/**
 * 僅當先前的計數已達到零或根本未設置時才設置新的計數值。
 */
boolean trySetCount(long count);
public RFuture<Boolean> trySetCountAsync(long count) {
    return commandExecutor.evalWriteAsync(getRawName(), LongCodec.INSTANCE, RedisCommands.EVAL_BOOLEAN,
            // 往redis中寫入一個String類型的數據    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}:{計數器總數}的String類型的數據。

三、countDown()源碼

減少鎖存器的計數器。當計數達到零時通知所有等待線程。

public RFuture<Void> countDownAsync() {
    return commandExecutor.evalWriteNoRetryAsync(getRawName(), LongCodec.INSTANCE, RedisCommands.EVAL_BOOLEAN,
                    // 減少redis中計數器的值
                    "local v = redis.call('decr', KEYS[1]);" +
                    // 計數器減為0后,刪除對應的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()源碼

等到計數器達到零。

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

關于“Redisson分布式閉鎖RCountDownLatch如何使用”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“Redisson分布式閉鎖RCountDownLatch如何使用”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

冕宁县| 成都市| 同德县| 潢川县| 余庆县| 璧山县| 丰顺县| 蓬莱市| 长宁区| 武清区| 四会市| 木兰县| 五华县| 嵊泗县| 永平县| 龙江县| 滕州市| 山阴县| 即墨市| 华蓥市| 策勒县| 乌拉特前旗| 金门县| 长沙市| 色达县| 贡觉县| 盐源县| 织金县| 炉霍县| 黔江区| 新丰县| 周宁县| 金湖县| 晋城| 巩留县| 兴海县| 思南县| 江西省| 常熟市| 乡城县| 邮箱|