Java各种Synchronizer: CountDownLatch, CyclicBarrier,Semaphore

SNN系列|编码篇(2)时序编码 Tempotral Coding 选择编码方法是要根据编码对象以及模型如何处理编码信息进行选择,如下是一种时序信息的编码对比: Threshold-based encoding 又称为tempotral contrast,该方法可以用于编解码一段序列,当差值超过阈值时发放脉冲,阈值是根据编码的序列自适应变化的。 使用该编码方法时,实值序列最好是沿时间变化的,因为在根据差分决定是否发放脉冲后,脉冲的顺序与差分顺序有关。 Time-to-first spike coding 该编码方法将信息用神经元首次 阅读详情

首先,锁也是一种Synchronizer ,包括ReentrantLock, synchronized,是为了确保共享数据被完整一致的修改,不被破坏。


其他的,比如Object.wait(), notify()等 主要用于合作的线程之间彼此协调,Blocking Queue,FurtureTask 都是synchronizer


CountDownLatch

有两个方法await() 和countDown(),用于主线程调用latch.await(),每个子线程完整自己的工作后调用latch.countDown(),当所有的子线程都表示down了,即latch的计数为0了, 主线程才从await返回往下执行。 类似Thread.join(),但是不需要针对Thread对象本身操作,而且,子线程done了不一定结束,调了latch.countDown()后还可以继续干别的事。 

初始计数值的大小,对应子任务的数目,而不一定是子线程的数目,可以一个子线程对应一个task,也可以多个


CyclicBarrier 栅栏

CyclicBarrier只有一个方法await(),好比一伙人到一个地方活动,先到的人先await(), 等所有的人都到了,才开始下一步活动。有几个人初始值就设为几,当所有的线程都到达barrier.await()这个点,大家都从await()中唤醒往下执行,最后一个调barrier.await的线程其实不阻塞。CyclicBarrier的构造函数还可以指定一个Runable,表示大家都到齐之后可以执行一个活动,这个是CyclicBarrier内部新开一个线程去执行的。

import java.util.Random;  
import java.util.concurrent.BrokenBarrierException;  
import java.util.concurrent.CyclicBarrier;  
import java.util.concurrent.ExecutorService;  
import java.util.concurrent.Executors;  
  
public class TestCyclicBarrier {  
  
    public static void main(String[] args) {  
      
        ExecutorService exec = Executors.newCachedThreadPool();       
        final Random random=new Random();  
          
        final CyclicBarrier barrier=new CyclicBarrier(4,new Runnable(){  
            @Override  
            public void run() {  
                System.out.println("大家都到齐了,开始happy去");  
            }});  
          
        for(int i=0;i<4;i++){  
            exec.execute(new Runnable(){  
                @Override  
                public void run() {  
                    try {  
                        Thread.sleep(random.nextInt(1000));  
                    } catch (InterruptedException e) {  
                        e.printStackTrace();  
                    }  
                    System.out.println(Thread.currentThread().getName()+"到了,其他哥们呢");  
                    try {  
                        barrier.await();//等待其他哥们  
                    } catch (InterruptedException e) {  
                        e.printStackTrace();  
                    } catch (BrokenBarrierException e) {  
                        e.printStackTrace();  
                    }  
                }});  
        }  
        exec.shutdown();  
    }  
}  


Semaphore

是独占锁的generalization版本,允许一定数量的线程进入而不是一个。


Object.wait() / notifyAll(),  Condition.await() / signalAll(),基于条件的Synchronizer 

之前的Synchronizer 是基于独占(lock),限流(Semaphore),或者某种计数(CountDownLatch,CylicBarrier),而这组Synchronizer 是基于条件的

有的线程等待某种条件为真才往下执行,有的线程改变这个条件。


基于条件的Synchronizer (wait, notify) 是最基本的,其他的synchronizer都可以用wait / notify自己实现,只是不同synchronizer的条件不一样而已

CountDownLatch 和CyclicBarrier 的条件都是一个计数值,

对于CountDownLatch , 一部分线程调用await等待计数值为0,另一部分线程调用coutDown的线程改变计数值

对于CyclicBarrier 只有await操作,所有线程都调用await,awai操作t既改变计数值,又会等待计数值为0

class CountDownLatch {
	int count;
	Lock lock;
	Condition c;
	public CountDownLatch(int x) {
		count = x;
		lock = new ReentrantLock();
		c = lock.newCondition();
	}
	public void countDown() {
		lock.lock();
		try {
			if (count > 0) --count;
			if (count == 0) c.signalAll();
		} finally {
			lock.unlock();
		}
	}	
	public void await() {
		lock.lock();
		try {
			if (count > 0) c.await();
		} catch (InterruptedException e){
			
		}
		finally {
			lock.unlock();
		}
	}
}

一种有界阻塞队列的实现,条件是queue的 size, 也可以用Semaphore做

class BoundedQueue<T> {
	private Deque<T> q = new LinkedList<T>();
	private int size;
	private Lock lock = new ReentrantLock();
	private Condition produceSignal;
	private Condition consumeSignal;
	public BoundedQueue(int size) {
		this.size = size;
		produceSignal = lock.newCondition();
		consumeSignal = lock.newCondition();
	}
	
	public  boolean offer(T e) throws InterruptedException {
		try {
			lock.lock();
			while(q.size() == size) {
				produceSignal.await();				
			}
			if (q.offer(e)) {
				consumeSignal.signal();
				return true;
			}
			return false;
		} finally {
			lock.unlock();
		}
		
		
	}
	public T poll() throws InterruptedException {
		try {
			lock.lock();
			while (q.isEmpty()) {
				consumeSignal.await();				
			}
			return q.poll();
		} finally {
			lock.unlock();
		}
	}
}
class BoundedQueue2<T> {
	Deque<T> queue = new LinkedList<T>();
	Semaphore emptySem, fullSem;
	public BoundedQueue2(int size) {
		emptySem = new Semaphore(size);
		fullSem = new Semaphore(0);
	}
	public void offer(T item) throws InterruptedException {
		emptySem.acquire();
		if (queue.offer(item))
			fullSem.release();
		else
			emptySem.release();
	}
	
	public T poll() throws InterruptedException {
		fullSem.acquire();
		T ret = queue.poll();
		emptySem.release();
		return ret;
	}
}

比较一下两种实现,1)锁+ 自定义 条件(size)  , 2)2个Semaphone,

1)Semaphore把计数的check 和修改在一起作为原子操作, 而方案一需要自己维护lock保护共享数据,并且需要while来循环检查条件,多浪费了些cpu资源

2)Semaphore的方案并发度更细,并没有额外的去保护内置队列同时只被一个线程访问,这个是否有必要,看情景多线程读多线程写的情况是需要保护内置结构的访问的,比如连续的两个写,从Semaphore角度只要没满都可以过,但是同时的插入队尾是有问题的。

3)总结,Semaphore提供的便利类似原子操作CAS,比较和Increment一起作为原子操作。只是确保有资源的情况才允许线程进入,但是没有解决另一个问题,共享数据被安全的访问的问题。




新四化浪潮下,中年整车诊断工程师的黄金突围路 摘要 本文探讨了汽车电子诊断工程师在当前行业变革中的独特优势与发展路径。作者作为从业者指出,整车诊断岗位在汽车"新四化"浪潮中呈现"逆生长"特性:技术壁垒高、经验复利强、市场需求持续增长。中年工程师凭借丰富的案例积累和实战经验成为行业稀缺人才,薪资水平显著高于同龄段其他技术岗位。文章分析了四条职业发展路径(技术专家、技术管理、细分深耕、横向拓展),并警示了三大职业风险(执行层局限、技术停滞、成果沉淀不足)。最后提出具体建议,强调掌握UDS高阶、DoIP以太网诊断等核心技术的重要性,为中年技术人提供了清晰的职 阅读详情

相关推荐

别再为多相机标定头疼了!用VisionMaster统一坐标系的保姆级教程

本文详细介绍了使用VisionMaster平台解决多相机视觉系统中坐标系统一问题的完整流程。从标定板选择到N点标定,再到实战演练,提供了从原理到落地的全方位指导,帮助工程师高效解决多相机定位引导中的坐标偏差问题。

weixin_38168322的博客 634

Java关键字之synchronized详解【Java多线程必备】

1. synchronized详解 2. synchronized使用注意事项和案例

Mr.绵羊的知识星球 6751

即梦 AI 全功能零基础详细教程(纯技术版)

即梦 AI 是一款多模态 AI 生成工具,主打文本生成视频、图片生成视频、角色一致性生成、音画同步等核心功能,依托自研 AI 视觉模型,实现从文本 / 图片 / 音频素材输入,到高清视频、图像内容输出的全流程 AI 创作,支持短视频、短剧、创意素材等多场景创作,具备操作门槛低、生成效率高、画面可控性强的技术特点。@为工具内置引用指令,作用是锁定指定素材 / 角色,强制 AI 按照该素材的核心特征生成内容,无额外付费、解锁要求,免费使用。剧本拆分:将短剧拆分为单镜头(15 秒内 / 个)

2501_92061023的博客 5839

Java多线程同步工具类:Semaphore、CountDownLatch 、CyclicBarrier、Exchanger原理剖析

Java多线程同步工具类:Semaphore、CountDownLatch 、CyclicBarrier、Exchanger原理剖析

大数据开发、JAVA开发、人工智能AI 1524

Android HTTPS抓包证书配置全解:Proxyman实战避坑指南

HTTPS抓包本质是中间人(MITM)通信的可信建立过程,其核心在于客户端对代理根证书的信任链配置。在Android平台,自7.0起系统默认不信任用户安装的CA证书,必须通过Network Security Config显式声明trust-anchors,将Proxyman导出的PEM格式根证书纳入App级信任锚点。这一机制区别于iOS和桌面浏览器,导致大量开发者卡在‘证书已安装却无法解密’的误区。技术价值在于打通开发调试闭环:精准定位SSLHandshakeException、绕过证书固定、支持React

weixin_32175665的博客 651

中兴U30air随身WiFi刷机全攻略:从ABD开启到系统调试(附工具包)

本文提供中兴U30air随身WiFi刷机全攻略,从ADB开启到系统调试的详细步骤,包括必备工具清单、ADB调试模式解锁、Bootloader解锁及自定义ROM刷入与调优。适合技术爱好者深度定制设备,提升网络性能和功能扩展。

weixin_29235923的博客 1958

Java JUC之CountDownLatch、CyclicBarrier以及Semaphore

对JUC中的CountDownLatch、CyclicBarrier以及Semaphore的学习,予以记录!i < N;* }* }//模拟班长最后锁门问题//模拟5位同学分别进行离开教室的操作i < 6;i++) {System.out.println(Thread.currentThread().getName()+" 同学走了");//最后输出班长锁门的情况。

qq_43357394的博客 421

点云从入门到精通技术详解100篇-基于点云语义分割的电力线提取及聚类研究

在现代社会,电力一直扮演着最重要的角色之一。它不仅与人民的生活息息相关,更是一个国家发展的命脉。近年来,随着我国各特高压输电线路建成(比如2022年1月份白鹤滩江苏特高压输电线路的放线)以及电网规模的不断扩大,我国年发电量稳步上升,人民的生活水平越来越高。我国土地辽阔,输电线路分布广泛,再加上地形环境复杂多样,电力线可能遭受风吹雨晒甚至是冰雪寒灾的影响。因此,为了保障电力线的可靠供电,防止停电意外发生,电力部门要定期对输电线路进行检查。目前我国主要。

getusushu的博客 1010

Java synchronized 关键字(2)-JVM 的锁实现分析

文章目录1. 前言2. 偏向锁3. 轻量级锁4. 重量级锁4.2 重量级锁的竞争 1. 前言 在 synchronized 同步代码块实现原理 一节中 2. 偏向锁 3. 轻量级锁 4. 重量级锁 4.2 重量级锁的竞争 该部分主要为重量级锁的竞争过程,可参考 Java 对象锁 Monitor 的实现 ...

谈谈1974 937

CKA-CN考试之路----1

后的的任意位置,但-n 和autoscale 必须是相连的.后面不再对命名空间部分做解释了.说明配置正确,如果无法保存退出,再次检查对齐.不用怀疑一定是复制的时候少了字母或者对齐出错.运行以下命令确认红色箭头的值和题目要求是否一致。将文档中的内容复制并粘贴到对应位置.,后续不再提醒yaml的对齐。确认脚本check1.sh。

Q先生 607

Vue - 超强实现网页禁止浏览器缩放功能,浏览器缩放时保持网页不变形、元素不会被挤压等,屏蔽浏览器鼠标滚轮缩放页面(提供详细示例代码,一次引入整个网站无人可以搞乱你的页面布局及样式)

vue,nuxt,禁止浏览器缩放,如何用户缩放浏览器导致页面变形,网页缩放后页面变形了怎么办,怎么解决网站被缩放后元素乱套错乱,vue怎么禁止网页不被缩放,vue如何禁止浏览器缩放,vue缩放网页变形影响布局怎么办,vue电脑分辨率及缩放导致页面变形的问题,前端页面解决浏览器或者系统被放大和缩小导致的显示问题,Vue中页面自适应缩放,如何防止Vue页面缩放时变形/调整大小,Vue项目中,防止页面被缩放和放大,vue等比例缩放网页,网页缩放后界面变形咋办,禁止页面缩放,vue禁止浏览器改变窗口大小,Vue项目

🏆 前端领域优质创作者 1万+

【Java并发编程】synchronized详解

深入解析了 Java 中 synchronized 关键字的原理,从源码层面揭示了其背后的实现机制和优化策略。

叉烧钵钵鸡的博客 4125

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

java 并发之(一)同步器(synchronizer)CountDownLatch、CyclicBarrier、Semaphore

  来自:http://janeky.iteye.com/blog/769965   Java1.5提供了一个非常高效实用的多线程包:java.util.concurrent, 提供了大量高级工具,可以帮助开发者编写高效、易维护、结构清晰的Java多线程程序。从这篇blog起,我将跟大家一起共同学习这些新的Java多线程构件 1. CountDownLatch (闭锁-倒数的锁)    ...

liao49的专栏 289

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Synchronizer 闭锁(CountDownLatch,FutureTask ) 信号量(Semaphore) 关卡(CyclicBarrier) 知识点总结(java并发编程实践读书笔记三)

Synchronizer     Synchronizer是一个对象,可以根据本身的状态调整线程的控制流 结构特性: 封装状态,而这些状态决定着线程执行到某一点时是通过还是被迫等待 提供操作状态的方法,以及高效的等待Synchronizer进入到期望状态的方法 理解:第一句话~                                      就阻塞队列来讲,它封装了

木杉林 2197

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Java 中的Synchronizer

1. 闭锁(Latch)     闭锁是一种Synchronizer,它可以延迟线程的进度直到线程达到终止状态。一个闭锁工作起来就像一道大门:直到闭锁达到终点状态之前,门一直是关闭的,没有线程能通过,在终点状态到来的时候,门开了,允许所有线程都通过。一旦闭锁到达了终点状态,它就不能够再改变状态了,所以它永远保持敞开状态。闭锁可以用来确保特定活动,直到其他的活动完成之后才发生。     Coun

wangkr的专栏 1905

JAVA的Synchronizer

一、闭锁: 可以延迟某一组或一个线程的执行到另一组或另一个线程运行至某一特定点,例如一个服务需要等待它所依赖的服务都已经开始、一个用于计算的线程需要等待另外几项资源准备完毕。CountDownLatch是实现类之一,在CountDownLatch类中,countDown方法用于将计数器减一,await方法则会在调用位置阻塞到计数器为0或者被Interrupt。 import java.util.c...

m0_37537177的博客 324

java synchronizer_JAVA的Synchronizer

一、闭锁:可以延迟某一组或一个线程的执行到另一组或另一个线程运行至某一特定点,例如一个服务需要等待它所依赖的服务都已经开始、一个用于计算的线程需要等待另外几项资源准备完毕。CountDownLatch是实现类之一,在CountDownLatch类中,countDown方法用于将计数器减一,await方法则会在调用位置阻塞到计数器为0或者被Interrupt。import java.util.con...

weixin_31211821的博客 299

java synchronizer_JAVA-AbstractQueuedSynchronizer-AQS

import lombok.extern.slf4j.Slf4j;import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;@Slf4...

weixin_26777941的博客 85

J.U.C-synchronizer

同步器 ,这部分主要是对线程集合的管理的实现,有 Semaphore CyclicBarrier CountDownLatch Exchanger Semaphore 类 java.util.concurrent.Semaphore 提供了一个计数信号量,从概念上讲,信号量维护了一个许可集。如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。每个 ...

小诚信驿站 399

java并发之(4):Semaphore信号量、CounDownLatch计数锁存器和CyclicBarrier循环栅栏

简介 java.util.concurrent包是Java 5的一个重大改进,java.util.concurrent包提供了多种线程间同步和通信的机制,比如Executors, Queues, Timing, Synchronizers和Concurrent Collections等。与synchronized关键字和Object.notify()等方法相比,这些类和方法的抽象层次都较...

weixin_33922672的博客 260

java里面的Synchronizers--Latch,Barrier,Semaphore,ReentrantLock,Condtion

昨晚闲来翻了一会Java ConcurrentCy in Practise, 进一步明确了java 一些 Synchronizers的用法,在此简单记录一下 昨日随手写的demo代码。只是为了加深印象,所以不怎么讲究,如有看官路过请不要挑剔:   import java.util.concurrent.BrokenBarrierException; import java.util.co...

softtech2008的博客 205

Synchronizer类

Synchronizerjava.util.concurrent 中其他类别的有用的类也是同步工具。这组类相互协作,控制一个或多个线程的执行流。 Semaphore、CyclicBarrier、CountdownLatch 和 Exchanger 类都是同步工具的例子。每个类都有线程可以调用的方法,方法是否被阻塞取决于正在使用的特定同步工具的状态和规则。SemaphoreSemaphore 类实现标准 Dijkstra 计数信号。计数信号可以认为具有一定数量的许可权,该许可权可以获得或释放

kun81的专栏 580

Synchronizer 类

  Synchronizer 类 Synchronizer java.util.concurrent 中其他类别的有用的类也是同步工具。这组类相互协作,控制一个或多个线程的执行流。 Semaphore、CyclicBarrier、CountdownLatch 和 Exchanger 类都是同步工具的例子。每个类都有线程可以调用的方法,方法是否被阻塞取决于正在使用的特定同步工具的状态和规则。...

gufengjava的专栏 186

JDK Concurrent: Synchronizer

 ---------------------------------------CountDownLatchA synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes.A Count

FireCoder的专栏 700

java Abstract Queued Synchronizer

java Abstract Queued Synchronizer

weixin_47503016的博客 293

java 并发同步_Java中同步与并发用法分析

本文较为详细的分析了Java中同步与并发的用法。分享给大家供大家参考。具体分析如下:1.同步容器类包括两部分:vector和hashtable另一类是同步包装类,由Collections.synchronizedXXX创建。同步容器对容器的所有状态进行串行访问,从而实现线程安全。它们存在如下问题:a) 对于符合操作,需要额外的锁保护。比如迭代,缺少则添加等条件运算。b) toString,hash...

weixin_39573981的博客 177
上一篇: 如何提高并发度?读写锁,分拆锁、分离锁,ThreadLocal,copyOnWrite,工作队列 per thread, 工作窃取
下一篇: zookeeper 和分布式系统的一般问题
binling
博客等级 码龄25年 21粉丝 235原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值