Redisson分布式閉鎖RCountDownLatch的使用詳細(xì)講解
本篇文章基于redisson-3.17.6版本源碼進(jìn)行分析
一、RCountDownLatch的使用
RCountDownLatch的功能跟CountDownLatch,用于實(shí)現(xiàn)某個(gè)線程需要等待其他線程都完成之后,我再去執(zhí)行,這種場(chǎng)景就可以使用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() + "離開(kāi)教師...");
rCountDownLatch.countDown();
}, "A" + i).start();
}
try {
rCountDownLatch.await();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println("班長(zhǎng)鎖門...");
}A1離開(kāi)教師...
A2離開(kāi)教師...
A4離開(kāi)教師...
A3離開(kāi)教師...
A5離開(kāi)教師...
班長(zhǎng)鎖門...
二、trySetCount()設(shè)置計(jì)數(shù)器
/** * 僅當(dāng)先前的計(jì)數(shù)已達(dá)到零或根本未設(shè)置時(shí)才設(shè)置新的計(jì)數(shù)值。 */ boolean trySetCount(long count);
public RFuture<Boolean> trySetCountAsync(long count) {
return commandExecutor.evalWriteAsync(getRawName(), LongCodec.INSTANCE, RedisCommands.EVAL_BOOLEAN,
// 往redis中寫(xiě)入一個(gè)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中寫(xiě)入了一個(gè){key}:{計(jì)數(shù)器總數(shù)}的String類型的數(shù)據(jù)。
三、countDown()源碼
減少鎖存器的計(jì)數(shù)器。當(dāng)計(jì)數(shù)達(dá)到零時(shí)通知所有等待線程。
public RFuture<Void> countDownAsync() {
return commandExecutor.evalWriteNoRetryAsync(getRawName(), LongCodec.INSTANCE, RedisCommands.EVAL_BOOLEAN,
// 減少redis中計(jì)數(shù)器的值
"local v = redis.call('decr', KEYS[1]);" +
// 計(jì)數(shù)器減為0后,刪除對(duì)應(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()源碼
等到計(jì)數(shù)器達(dá)到零。
public void await() throws InterruptedException {
// 如果計(jì)數(shù)器為0,直接返回
if (getCount() == 0) {
return;
}
// 訂閱redisson_countdownlatch__channel__{anyCountDownLatch}的消息
CompletableFuture<RedissonCountDownLatchEntry> future = subscribe();
RedissonCountDownLatchEntry entry = commandExecutor.getInterrupted(future);
try {
// 不斷循環(huán)判斷計(jì)數(shù)器的值是否大于0,大于0說(shuō)明還有線程沒(méi)執(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Netty核心功能之?dāng)?shù)據(jù)容器ByteBuf詳解
這篇文章主要為大家介紹了Netty核心功能之?dāng)?shù)據(jù)容器ByteBuf詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
關(guān)于網(wǎng)頁(yè)報(bào)錯(cuò)404原因以及解決方法
404錯(cuò)誤是網(wǎng)站常見(jiàn)的錯(cuò)誤之一,出現(xiàn)的原因很多,解決方法也有很多種,這篇文章主要給大家介紹了關(guān)于網(wǎng)頁(yè)報(bào)錯(cuò)404原因以及解決方法的相關(guān)資料,需要的朋友可以參考下2024-01-01
JAVA內(nèi)存空間相關(guān)知識(shí)匯總
這篇文章主要介紹了JAVA內(nèi)存空間相關(guān)知識(shí),文中介紹的非常詳細(xì),代碼幫助大家更好的參考和學(xué)習(xí),感興趣的朋友可以了解下2020-06-06
Nacos配置文件使用經(jīng)驗(yàn)及CAP原則詳解
這篇文章主要為大家介紹了Nacos配置文件使用經(jīng)驗(yàn)及CAP規(guī)則詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-02-02
Java實(shí)現(xiàn)非阻塞式服務(wù)器的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用Java實(shí)現(xiàn)一個(gè)簡(jiǎn)單的非阻塞式服務(wù)器,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,需要的可以參考一下2023-05-05
Java基于分治法實(shí)現(xiàn)的快速排序算法示例
這篇文章主要介紹了Java基于分治法實(shí)現(xiàn)的快速排序算法,結(jié)合實(shí)例形式分析了java基于分治法的快速排序相關(guān)實(shí)現(xiàn)技巧,代碼中備有較為詳細(xì)的注釋說(shuō)明便于理解,需要的朋友可以參考下2017-12-12
Spring多數(shù)據(jù)源切換失敗,發(fā)現(xiàn)與事務(wù)相關(guān)問(wèn)題
這篇文章主要介紹了Spring多數(shù)據(jù)源切換失敗,發(fā)現(xiàn)與事務(wù)相關(guān)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
關(guān)于JVM默認(rèn)堆內(nèi)存大小問(wèn)題
這篇文章主要介紹了關(guān)于JVM默認(rèn)堆內(nèi)存大小問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02

