ReentrantLock(可重入锁) Semaphore(信号量) CountDownLatch
目录
- ReentrantLock(可重入锁) &Semaphore(信号量)&CountDownLatch
- ReentrantLock(可重入锁)
- 既然有了synchronized,为啥还要有ReentrantLock?
- Semaphore(信号量)
- 如何确保线程安全呢?
- CountDownLatch
ReentrantLock(可重入锁) &Semaphore(信号量)&CountDownLatch
ReentrantLock(可重入锁)
上古时期的Java中,synchronized不够强壮,功能也不够强大,也没有各种优化
ReentrantLock就是用来实现可重入锁的选择(历史遗留)
后来synchronized变得厉害了,ReentrantLock用的少了,但是仍有一席之地
synchronized也是可重入锁
传统的锁的风格,这个对象提供了两个方法: lock unlock 这个写法,就容易引起,加了锁之后,忘记解锁了
在unlock之前,触发了return或者异常,就可能引起unlock执行不到了
正确使用ReentrantLock就需要把unlock操作放到finally中
既然有了synchronized,为啥还要有ReentrantLock?
1.ReentrantLock提供了tryLock操作
lock直接进行加锁,如果加锁不成,就要阻塞
tryLock尝试进行加锁,如果加锁不成,不阻塞,直接返回false
此处通过tryLock提供了更多的“可操作空间”
2.ReentrantLock提供了公平锁的实现
ReentrantLock提供了公平锁的实现,通过队列记录加锁线程的先后顺序
synchronized是非公平锁
遵循先来后到,就是公平
3.搭配的等待通知机制不同
对于synchronized,搭配wait/notify
对于ReentrantLock,搭配 Condition类,功能比 wait/notify略强一点
实际上绝大部分开发中,使用synchronized就够用了
Semaphore(信号量)
信号量是由迪杰斯特拉提出来的
信号量也是操作系统内部给咱们提供的一个机制
操作系统对应的API被JVM封装了下,就可以通过Java代码来调用这里的相关操作了
所谓的锁,本质上也是一种特殊的信号量,
锁,可以认为就是计数值为1的信号量
释放状态,就是1
加锁状态,就是0
对于这种非0即1的信号量,称为“二元信号量”
信号量是更广义的锁
public class ThreadDemo37 {public static void main(String[] args) throws InterruptedException {Semaphore semaphore=new Semaphore(1);semaphore.acquire();System.out.println("申请1");semaphore.acquire();System.out.println("申请2");semaphore.acquire();System.out.println("申请3");}
}
import java.util.concurrent.Semaphore;public class ThreadDemo38 {public static int count=0;public static void main(String[] args) throws InterruptedException {Semaphore semaphore=new Semaphore(1);Thread t1=new Thread(()->{for(int i=0;i<500;i++){try {semaphore.acquire();} catch (InterruptedException e) {throw new RuntimeException(e);}count++;semaphore.release();}});Thread t2=new Thread(()->{for(int i=0;i<500;i++){try {semaphore.acquire();} catch (InterruptedException e) {throw new RuntimeException(e);}count++;semaphore.release();}});t1.start();t2.start();t1.join();t2.join();System.out.println(count);}
}
如何确保线程安全呢?
1.synchronized
2.ReentrantLock
3.CAS(原子类)
4.Semaphore
semaphore也可以用来实现生产者消费者模型
定义两个信号量
一个用来表示,队列中有多少个可以被消费的元素,sem1
另一个用来表示队列中有多少个可以放置新元素的空间 ,sem2
生产一个元素,sem1.V() , sem2.P()
消费一个元素,sem1.P() , sem2.V()
CountDownLatch
针对特定场景解决问题的小工具!
比如,多线程执行一个任务,把大的任务拆分成几个部分,由每个线程分别执行
下载一个文件,可能很大,但是可以拆成多个部分,每个线程负责下载一部分,下载完成之和,最终把下载的结果拼在一起。
像多线程下载这样的场景,最终执行完成之后,要把所有内容拼在一起
这个拼必然要等到所有线程执行完成
使用CountDownLatch就可以很方便的感知到这个事情!(比你调用很多次join要更简单方便一些)
如果使用join方式,就只能使用每个线程执行一个任务
借助CountDownLatch就可以让一个线程能执行很多个任务
import java.util.Random;
import java.util.concurrent.CountDownLatch;public class ThreadDemo39 {public static void main(String[] args) throws InterruptedException {CountDownLatch latch=new CountDownLatch(10);for(int i=0;i<10;i++){int id=i;Thread t=new Thread(()->{System.out.println("任务:"+id+",开始下载");Random random = new Random();// [0, 5)int time = (random.nextInt(5) + 1) * 1000;try {Thread.sleep(time);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("任务:"+id+",结束下载");latch.countDown();}) ;t.start();}latch.await();System.out.println("所有下载完毕");}
}
相关文章:

ReentrantLock(可重入锁) Semaphore(信号量) CountDownLatch
目录 ReentrantLock(可重入锁) &Semaphore(信号量)&CountDownLatchReentrantLock(可重入锁)既然有了synchronized,为啥还要有ReentrantLock?Semaphore(信号量)如何确保线程安全呢?CountDownLatch ReentrantLock(可重入锁) &Semaphore(信号量…...
计算机网络习题解答--个人笔记(未完)
本篇文章为关于《计算机网络-自顶向下方法第七版》的阅读总结和课后习题解答(未完待续) 第二章: cookie:(这里是比较老版本的HTTP,具体HTTPs是怎么实现的不是很清楚)cookie的原理其实很简单。就是在HTTP消息头上又多…...
java虚拟机——频繁发生Full GC的原因有哪些?如何避免发生Full GC
什么是Full GC Full GC(Full Garbage Collection)是Java垃圾收集过程中的一种形式,它涉及整个堆内存(包括年轻代和老年代)以及方法区的垃圾收集。Full GC是一个相对重量级的操作,因为它需要遍历和回收整个…...
python学习笔记(12)算法(5)迭代与递归
一、迭代 迭代(iteration)是一种重复执行某个任务的控制结构。在迭代中,程序会在满足一定的条件下重复执行某段代码,直到这个条件不再满足。 迭代通常用于解决需要逐步推进的计算问题,例如遍历数组、计算阶乘等。迭代…...

从零开始:Linux 环境下的 C/C++ 编译教程
个人主页:chian-ocean 文章专栏 前言: GCC(GNU Compiler Collection)是一个功能强大的编译器集合,支持多种语言,包括 C 和 C。其中 gcc 用于 C 语言编译,g 专用于 C 编译。 Linux GCC or G的安…...
Rust学习(十):计算机科学简述
Rust学习(十):计算机科学简述 在计算机技术这片广袤的领域中,深入理解其内在机制与逻辑需要付出诸多努力。 学习基础知识是构建计算机技术能力大厦的基石,而这一过程往往漫长而艰辛。只有在对基础知识有了扎实的掌握…...
【西瓜书】剪枝与样本值处理——预剪枝、后剪枝、连续值、缺失值
目录 预剪枝 后剪枝 处理连续值 处理缺失值 剪枝(pruning)是决策树学习算法对付“过拟合”的主要手段。 在决策树学习过程中,有时会造成决策树分枝过多,就可能造成过拟合,可通过主动去掉一些分支来降低过离合的风…...

NLP 1、人工智能与NLP简介
人人都不看好你,可偏偏你最争气 —— 24.11.26 一、AI和NLP的基本介绍 1.人工智能发展流程 弱人工智能 ——> 强人工智能 ——> 超人工智能 ① 弱人工智能 人工智能算法只能在限定领域解决特定的问题 eg:特定场景下的文本分类、垂直领域下的对…...
常见线程安全问题之Double Checked Locking
创作内容丰富的干货文章很费心力,感谢点过此文章的读者,点一个关注鼓励一下作者,激励他分享更多的精彩好文,谢谢大家! 双重锁定检查(Double Checked Locking,下称 DCL)是并发下实现懒…...
Redis(非关系型数据库)的作用 详细解读
edis(Remote Dictionary Server)是一个开源的、高性能的、基于内存的数据结构存储系统。它具有极高的读写性能,并且能够支持多种数据结构的存储。Redis 最初的设计目标是作为一个缓存解决方案,但随着其功能的不断扩展,…...

互联网视频推拉流EasyDSS视频直播点播平台视频转码有哪些技术特点和应用?
视频转码本质上是一个先解码再编码的过程。在转码过程中,原始视频码流首先被解码成原始图像数据,然后再根据目标编码标准、分辨率、帧率、码率等参数重新进行编码。这样,转换前后的码流可能遵循相同的视频编码标准,也可能不遵循。…...
python之多元线性回归
目录 前言实战 前言 多元线性回归是回归分析中的一种复杂模型,它考虑了多个输入变量对输出变量的影响。与一元线性回归不同,多元线性回归通过引入多个因素,更全面地建模了系统关系。 多元线性回归模型的表达式为: f ( X ) K T …...

学习threejs,使用设置lightMap光照贴图创建阴影效果
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.MeshLambertMaterial…...

一,SQL注入解题(猫舍)
封神台 第一章:为了女神小芳! Tips: 通过sql注入拿到管理员密码! 尤里正在追女神小芳,在得知小芳开了一家公司后,尤里通过whois查询发现了小芳公司网站 学过一点黑客技术的他,想在女神面前炫炫技。于是他…...

海康大华宇视视频平台EasyCVR私有化部署视频平台海康ISUP是什么?如何接入到EasyCVR?
在现代安防领域,随着技术的发展和需求的增加,对于视频监控系统的远程管理和互联互通能力提出了更高的要求。海康威视的ISUP协议(以及功能相似的EHOME协议)因此应运而生,它们为不具备固定IP接入的设备提供了一种有效的中…...

Java ArrayList 与顺序表:在编程海洋中把握数据结构的关键之锚
我的个人主页 我的专栏:Java-数据结构,希望能帮助到大家!!!点赞❤ 收藏❤ 前言:在 Java编程的广袤世界里,数据结构犹如精巧的建筑蓝图,决定着程序在数据处理与存储时的效率、灵活性以…...

windows下安装wsl的ubuntu,同时配置深度学习环境
写在前面,本次文章只是个人学习记录,不具备教程的作用。个别信息是网上的,我会标注,个人是gpt生成的 安装wsl 直接看这个就行;可以不用备份软件源。 https://blog.csdn.net/weixin_44301630/article/details/1223900…...

开展网络安全成熟度评估:业务分析师的工具和技术
想象一下,您坐在飞机驾驶舱内。起飞前,您需要确保所有系统(从发动机到导航工具)均正常运行。现在,将您的业务视为飞机,将网络安全视为飞行前必须检查的系统。就像飞行员依赖检查表一样,业务分析师使用网络安全成熟度评估来评估组织对网络威胁的准备程度。这些评估可帮助…...
Maven Surefire 插件简介
Maven Surefire 插件是 Maven 构建系统中的一个关键组件,专门用于在构建生命周期中执行单元测试。 它通常与 Maven 构建生命周期的测试阶段绑定,确保所有单元测试在项目编译后和打包前被执行。 最新版本 Maven Surefire 插件的最新版本为 3.5.2。 使…...

基于微信小程序的平价药房管理系统+LW参考示例
1.项目介绍 系统角色:管理员、医生、普通用户功能模块:用户管理、医生管理、药品分类管理、药品信息管理、在线问诊管理、生活常识管理、日常提醒管理、过期处理、订单管理等技术选型:SpringBoot,Vue,uniapp等测试环境…...

wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...

python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...