前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Lock和Synchronizer是什么关系?

Lock和Synchronizer是什么关系?

作者头像
dhyuan
发布于 2022-05-30 06:16:09
发布于 2022-05-30 06:16:09
3550
举报
文章被收录于专栏:响应式编程响应式编程

引子:书上说AbstractQueuedSynchronizer(AQS)是构建锁和Synchronizer的框架。锁,好像大家都知道,至少自以为都知道 :)。那什么是synchronizer呢?Lock和Synchronize是什么关系?

Synchronizer,它是一个根据自身状态调节线程执行的对象。就是用来协调(多)线程执行的对象。从这个角度讲Java的内置锁就是一种synchronizer,它以互斥的可重入的方式协调/控制线程的执行。

Java的阻塞队列也是一种synchronizser。

再比如:信号量Semaphore、闭锁Latch、关卡Barrier都是不同类型的synchronizer。

信号量

Semaphore可以用来控制同时访问某资源的线程数量。把对这些资源的获取操作包装起来,获取资源前先调用信号量的acquire()申请许可,资源使用使用完毕后通过release()释放许可。对池化资源的管理一般可用信号量完成。

闭锁

英文Latch有门闩的意思,门闩就是用来把门关紧不让出入。在并发编程里也是这个意思,我们用latch这个对象禁止线程的执行,什么时候允许线程通过这个门闩呢?对于CountDownLatch来说,就是计数变为0的时候。对于FutureTask来说就是可以拿到计算结果的时候(当然也可能是计算异常了)。一个应用场景:可以把闭锁当作一个发令枪,它可以让线程等到信号后一起运行。

看!还真有这种闩数大于一的门闩。

关卡

Barrier中文就是“障碍物、栅栏”的意思,文绉绉的翻译就是“关卡”。它其实像极了闭锁,与闭锁不同的是:闭锁等待的是事件,而关卡等待的是线程。从API调用的感觉感觉上讲,Barrier是在工作线程正儿八经的工作都执行完毕后(取决于业务场景),调用barrier.await()使工作线程阻塞住,直到所有其它工作线程也都完成个各自的任务并都调用了barrier.await(),这个时候关卡就被冲破。这里等待的条件是有足够的线程调用barrier.await()。而Latch是在工作线程中调用latch.await(),等待闭锁被开启来执行。闭锁是怎样被开启的?它是依靠latch.countDown()到0后被开启的,谁countdown跟哪个线程没什么直接关系。而barrier.await()是需要实实在在的线程阻塞,这就是为什么说barrier等待的是线程,latch等的是信号。

经常使用关卡到场景是,一个任务分成n个子任务后,等待这n个子任务都完成后再做下一步工作。

CyclicBarrier的构造函数接受一个线程数以及一个关卡被突破后要执行的动作。

Exchanger是另一种关卡,用来为两个线程交换数据,当然是以线程安全的方式交换。

Reference:

https://web.mit.edu/6.005/www/fa15/classes/23-locks/

《Java并发编程实践》

https://en.wikipedia.org/wiki/Synchronization_(computer_science)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 响应式编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ReentrantReadWriteLock 锁
Java 的并发包提供了读写锁 ReentrantReadWriteLock ,其拥有两个锁:读锁-共享锁;写锁-排他锁。如果其他线程没有持有写锁,线程就能获得读锁。而只有其他线程没有持有任何锁,线程才能获得写锁。这样在没有写操作的时候,允许多个线程同时读一个资源,提高并发效率。
Qwe7
2022/08/07
2540
Java并发编程的艺术(八)——闭锁、同步屏障、信号量详解
1. 闭锁:CountDownLatch 1.1 使用场景 若有多条线程,其中一条线程需要等到其他所有线程准备完所需的资源后才能运行,这样的情况可以使用闭锁。 1.2 代码实现 // 初始化闭锁,并设置资源个数 CountDownLatch latch = new CountDownLatch(2); Thread t1 = new Thread( new Runnable(){ public void run(){ // 加载资源1 加载资源的代码……
大闲人柴毛毛
2018/03/09
8210
Java并发编程学习8-同步工具类(闭锁、信号量和栅栏)
同步工具类可以是任意一个对象,只要它根据其自身的状态来协调线程的控制流。阻塞队列可以作为同步工具类,类似地还有信号量(Semaphore)、栅栏(Barrier)以及闭锁(Latch)。当然 Java 平台类库中还有其他的一些同步工具类,如果这些都不能满足要求,那我们还可以创建自己的同步工具类【这块内容将在后续的博文中会介绍】。
huazie
2024/09/27
1600
Java并发编程学习8-同步工具类(闭锁、信号量和栅栏)
【JUC基础】08. 三大工具类
JUC包中包含了三个非常实用的工具类:CountDownLatch(倒计数器),CyclicBarrier(循环栅栏),Semaphore(信号量)。
有一只柴犬
2024/01/25
1710
【JUC基础】08. 三大工具类
Java并发工具篇
前面我们介绍了 JUC 中的并发容器,它相当于一个同步容器的升级版,很大程度上提高了并发的性能
汤圆学Java
2021/05/12
4820
(81) 并发同步协作工具 / 计算机程序的思维逻辑
查看历史文章,请点击上方链接关注公众号。 我们在67节和68节实现了线程的一些基本协作机制,那是利用基本的wait/notify实现的,我们提到,Java并发包中有一些专门的同步工具类,本节,我们就来探讨它们。 我们要探讨的工具类包括: 读写锁ReentrantReadWriteLock 信号量Semaphore 倒计时门栓CountDownLatch 循环栅栏CyclicBarrier 与71节介绍的显示锁和72节介绍的显示条件类似,它们也都是基于AQS实现的,AQS可参看71节。在一些特定的同步协作场
swiftma
2018/01/31
6370
万字图解 Java 并发框架:Fork/Join、CountDownLatch、Semaphore、CyclicBarrier
在第一章节《1.6w 字图解 Java 并发:多线程挑战、线程状态和通信、死锁;AQS、ReentrantLock、Condition 使用和原理》,我们开启了 Java 高并发系列的学习,透彻理解 Java 并发编程基础,主要内容有:
码哥字节
2025/04/23
1550
万字图解 Java 并发框架:Fork/Join、CountDownLatch、Semaphore、CyclicBarrier
AQS、CountDownLatch、CyclicBarrier、Semaphore、Exchanger
在编程的竞技场中,多线程与并发是每一级大牛必备的技能!今天,就让我们深入了解Java并发武器库中的“五神兵”——AQS、CountDownLatch、CyclicBarrier、Semaphore、Exchanger的强大之处。他们如棋盘上的棋子,既能彼此协调,又能独当一面,解决了无数线程之问的冲突、同步与协作难题。
疯狂的KK
2024/06/04
1430
AQS、CountDownLatch、CyclicBarrier、Semaphore、Exchanger
【小家java】JUC并发编程工具之CountDownLatch(闭锁)、CyclicBarrier、Semaphore的使用
CountDownLatch:是一个同步工具类,用来协调多个线程之间的同步,或者说起到线程之间的通信(而不是用作互斥的作用)。
YourBatman
2019/09/03
5880
【小家java】JUC并发编程工具之CountDownLatch(闭锁)、CyclicBarrier、Semaphore的使用
探秘Java并发模块:容器与工具类
在谈及同步容器之前,必须要说说他们的老前辈同步容器类。同步容器类的代表就是Vector和HashTable,这是早期JDK中提供的类。此外Collections.synchronizedXXX等工厂方法也可以把普通的容器(如HashMap)封装成同步容器。这些同步容器类的共同点就是:使用同步(Synchronized)方法来封装容器的操作方法,以保证容器多线程安全,但这样也使得容器的每次操作都会对整个容器上锁,所以同一时刻只能有一个线程访问容器。
lyb-geek
2019/05/13
3900
探秘Java并发模块:容器与工具类
快速了解基于AQS实现的Java并发工具类
AQS是AbstractQueuedSynchronizer的简称,类如其名,抽象的队列式的同步器,它是一个Java提高的底层同步工具类,用一个int类型的变量表示同步状态,并提供了一系列的CAS操作来管理这个同步状态,许多同步类实现都依赖于它,如常用的CountDownLatch、Semaphore、CyclicBarrier、ReentrantLock和StampedLock,后文会逐个介绍。
全菜工程师小辉
2019/08/16
8190
​Java 并发包提供了哪些并发工具类
假设有10个人排队,我们将其分成5个人一批,使用CountDownLatc 来协调。
王小明_HIT
2020/05/08
1.2K0
​Java 并发包提供了哪些并发工具类
我用这个同步工具类优化了一个人脸识别项目,启动时间从40分钟降到10分钟...
我将结合一个真实线上案例作为背景来展开讲解这一知识点。给大家讲清楚什么是同步工具类、适合的场景、解决了什么问题、各个实现方案的对比。希望对大家理解同步工具类这个知识点有所帮助。
陶朱公Boy
2022/10/28
2740
我用这个同步工具类优化了一个人脸识别项目,启动时间从40分钟降到10分钟...
同步器
Java提供两种同步机制,一种是内置的synchronize,另外一种就是大名鼎鼎的AQS,基于AQS实现了很多同步器:倒数闩锁(CountDownLatch)、信号量(Semaphore)、可循环使用的屏障(CyclicBarrier)。
搬砖俱乐部
2019/06/15
4900
Concurrent包之lock
相对传统的synchronized而言,Lock提供有公平和非公平策略,所以Lock的应用更加灵活。
姜同学
2022/10/27
1860
Java并发工具类(JUC)
在J.U.C包中,提供了几个非常有用的并发工具类,CountDownLatch、CyclicBarrier和Semaphore工具类提供了一种并发流程控制的手段,Exchanger工具类则提供了在线程间交换数据的一种手段。
chenchenchen
2022/01/05
8650
掌握Java同步,打造高效并发编程技巧
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
喵手
2023/11/21
2650
掌握Java同步,打造高效并发编程技巧
Java线程并发:知识点
常见形式:将对象的的引用存储到公共静态域;非私有方法中返回引用;发布内部类实例,包含引用。
WindWant
2020/09/11
4910
Java并发编程系列-(2) 线程的并发工具类
JDK 7中引入了fork-join框架,专门来解决计算密集型的任务。可以将一个大任务,拆分成若干个小任务,如下图所示:
码老思
2023/10/19
2350
Java并发编程系列-(2) 线程的并发工具类
彻底理解Java并发:Java并发工具类
CountDownLatch 线程计数器,俗称闭锁,作用是类似加强版的 Join,是让一组线程等待其他的线程完成工作以后才执行
栗筝i
2022/12/01
5680
相关推荐
ReentrantReadWriteLock 锁
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档