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等测试环境…...
PvZ Toolkit 技术指南:从游戏修改到体验重塑
PvZ Toolkit 技术指南:从游戏修改到体验重塑 【免费下载链接】pvztoolkit 植物大战僵尸 PC 版综合修改器 项目地址: https://gitcode.com/gh_mirrors/pv/pvztoolkit 价值定位:为什么选择 PvZ Toolkit? 当你在《植物大战僵尸》无尽模式…...
4个关键步骤:全方位掌控BetterJoy让Switch手柄在PC上完美适配
4个关键步骤:全方位掌控BetterJoy让Switch手柄在PC上完美适配 【免费下载链接】BetterJoy Allows the Nintendo Switch Pro Controller, Joycons and SNES controller to be used with CEMU, Citra, Dolphin, Yuzu and as generic XInput 项目地址: https://gitco…...
VideoAgentTrek-ScreenFilter在CAD教学中的应用:自动筛选设计演示视频重点
VideoAgentTrek-ScreenFilter在CAD教学中的应用:自动筛选设计演示视频重点 每次上完CAD软件课,你是不是都有这样的感觉?老师演示了两个小时,鼠标点得飞快,步骤一个接一个。你录了屏,打算课后复习ÿ…...
BGE-Reranker-v2-m3批量处理优化:提升高并发排序效率
BGE-Reranker-v2-m3批量处理优化:提升高并发排序效率 你是不是也遇到过这样的问题?在搭建RAG系统时,向量检索返回了一大堆文档,但真正相关的却没几个。大模型拿着这些“噪音”文档生成答案,结果要么答非所问ÿ…...
RK3568开发板烧录避坑指南:Maskrom和Loader模式切换失败?手把手教你排查(附串口调试技巧)
RK3568开发板烧录模式切换全攻略:从原理到实战排查 刚拿到RK3568开发板的开发者们,往往会在第一个环节就遭遇"拦路虎"——开发板死活进不了Maskrom或Loader模式。看着官方文档里简单的按键操作说明,实际操作时却像在玩一场没有规则…...
5个技巧让CUDA应用在非NVIDIA显卡发挥最大价值——ZLUDA完全指南
5个技巧让CUDA应用在非NVIDIA显卡发挥最大价值——ZLUDA完全指南 【免费下载链接】ZLUDA CUDA on Intel GPUs 项目地址: https://gitcode.com/GitHub_Trending/zl/ZLUDA 在AI与高性能计算领域,CUDA生态的垄断地位让许多开发者和企业面临硬件选择困境。跨平台…...
Qwen2.5-7B-Instruct升级体验:从1.5B到7B,感受旗舰模型的能力跃升
Qwen2.5-7B-Instruct升级体验:从1.5B到7B,感受旗舰模型的能力跃升 1. 引言:从轻量到旗舰的进化之路 作为长期关注开源大模型的技术从业者,我见证了Qwen系列模型的快速迭代。从最初的1.5B轻量版到如今的7B旗舰版,Qwen…...
从‘知识冲突’到‘对齐’:图解ProGrad如何让CLIP微调既专又通
ProGrad:用向量几何重新思考多模态模型的微调艺术 想象一下,你正在训练一位精通多国语言的老教授学习一门新方言。如果完全放任他自由发挥,可能会丢失原有的语言体系;如果限制太多,又无法适应新语境。这正是CLIP等预训…...
利用快马AI快速生成n8n自动化工作流原型,十分钟搭建业务逻辑骨架
今天想和大家分享一个快速搭建n8n自动化工作流原型的经验。作为一个经常需要处理各种自动化流程的开发者,我发现用InsCode(快马)平台可以大大缩短从构思到实现的时间。 为什么选择n8n工作流原型 n8n作为开源自动化工具,最大的优势就是可视化工作流设计…...
cat-catch:构建智能化媒体资源捕获的浏览器扩展解决方案
cat-catch:构建智能化媒体资源捕获的浏览器扩展解决方案 【免费下载链接】cat-catch 猫抓 chrome资源嗅探扩展 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch cat-catch是一款专注于网页媒体资源智能捕获的浏览器扩展工具,通过深度…...
