当前位置: 首页 > article >正文

redis面试(二十五)CountDownLatch实现

CountDownLatch最基本的原理,就是用来阻塞线程的,java本身也有CountDownLatch,用多线程处理分批处理多数据的时候很有用

基本的逻辑就是,同时开多个子线程,然后主线程进入等待,只有当其他子线程全都结束之后,主线程才会继续往下走。

而redis的CountDownLatch,可以设置指定的客户端(线程)数量,只有这些客户端,全都完成之后执行了countDown()方法之后,才会继续往下走。

没有达到指定线程数量的话,所有客户端就一直阻塞
就是java里面CountDownLatch的分布式版

不过一般来说,用CountDownLatch都是在本地使用就够了,redis的用不到。

实现


		RCountDownLatch latch = redisson.getCountDownLatch("anyCountDownLatch");
		latch.trySetCount(3);
		System.out.println(new Date() + ":线程[" + Thread.currentThread().getName() + "]设置了必须有3个线程执行countDown,进入等待中。。。"); 
		
		for(int i = 0; i < 3; i++) {
			new Thread(new Runnable() {

				@Override
				public void run() {
					try {
						System.out.println(new Date() + ":线程[" + Thread.currentThread().getName() + "]在做一些操作,请耐心等待。。。。。。"); 
						Thread.sleep(3000); 
						RCountDownLatch localLatch = redisson.getCountDownLatch("anyCountDownLatch");
						localLatch.countDown();
						System.out.println(new Date() + ":线程[" + Thread.currentThread().getName() + "]执行countDown操作"); 
					} catch (Exception e) {
						e.printStackTrace(); 
					}
				}
				
			}).start();
		}
		//这里会卡住,等待上面3个线程都执行countDown()方法后才往下执行
		latch.await();
		System.out.println(new Date() + ":线程[" + Thread.currentThread().getName() + "]收到通知,有3个线程都执行了countDown操作,可以继续往下走"); 

这两行代码是设置锁
RCountDownLatch latch = redisson.getCountDownLatch(“anyCountDownLatch”);
latch.trySetCount(3);

如果key不存在的话,设置这个key的制定值,并且发布一条消息
在这里插入图片描述

其他线程参与

在这里插入图片描述
每一个来参与的线程,都会给这个值-1,如果减到小于0了,就直接把这个数据删掉。
如果刚好=0 ,那么就发布一条消息广播。
在这里插入图片描述

客户端等待

在这里插入图片描述

这里的意思就是
await()方法,其实就是陷入一个while true死循环,不断的get anyCountDownLatch的值,如果这个值还是大于0那么就继续死循环,否则的话呢,就退出这个死循环

countDown(),decr anyCountDownLatch,就是每次一个客户端执行countDown操作,其实就是将这个cocuntDownLatch的值递减1就可以了。如果这个值已经小于等于0,del anyCcoutnDownLatch,删除掉他就可以ile;

如果是这个值为0的时候,还会去发布一个消息,publish redisson_countdownlatch__channel__{anyCountDownLatch} 0

在这里插入图片描述


http://www.kler.cn/a/281902.html

相关文章:

  • 基于Java Springboot幼儿园管理系统
  • STM32 ADC --- 任意单通道采样
  • 【AI+教育】一些记录@2024.11.11
  • 十二:HTTP错误响应码:理解与应对
  • springboot如何获取控制层get和Post入参
  • 重构Action-cli前端脚手架
  • PyTorch概述
  • 未来工作场所:知识中台与AI的融合
  • k8s集群环境搭建(一主二从--kubeadm安装)
  • 用ESP32做一个可爱的无用机器人
  • python之多线程和多进程以及threading和multiprocessing模块
  • Java之二维数组
  • 01 初始化vue3项目
  • pytest断言总结
  • 代码随想录算法训练营第58天|拓扑排序精讲、dijkstra(朴素版)精讲
  • docker内安装miniconda
  • (十六)Flink 状态管理
  • [论文笔记] eval-big-refactor lm_eval 每两个任务使用一个gpu,并保证端口未被使用
  • 网络爬虫--生成假数据
  • uniapp icons图标不显示的问题解决
  • Python爬虫(一文通)
  • Leetcode 131.分割回文串 回溯 C++实现
  • 淘宝扭蛋机小程序,市场发展下的潜在机遇
  • Vue(三)内置指令v-text、html、cloak、once、pre;自定义指令的三种方式、Vue生命周期
  • 如何切换当前使用的IP代理协议
  • 【网络安全】服务基础第一阶段——第二节:Windows系统管理基础----虚拟化IP地址以及用户与组管理