并发编程JUC--Semaphore源码解析

Java并发编程核心:从JMM内存模型到JUC工具类实战解析 并发编程是现代软件开发的核心技术之一,它源于计算机多核架构下CPU缓存一致性与指令重排序带来的挑战。Java内存模型(JMM)通过happens-before原则和volatile关键字,为开发者提供了可见性与有序性的底层保证。基于此,java.util.concurrent(JUC)包提供了一系列高效、线程安全的工具类,其技术价值在于能够显著提升高并发场景下的程序性能与可靠性。例如,ConcurrentHashMap通过分段锁设计实现高并发读写,而ThreadPoolExecutor则通过核心参数配置实现 阅读详情

 

关于Semaphore的使用可以自行百度。

首选看下初始化构造函数

 

跟着构造函数会发现最终还是进入到了AbstractQueuedSynchronizer类的下面这个方法

 

到这里我们发现Semaphore底层还是使用了AQS来实现的。构造函数就是将我们设置的值赋给state这个变量

现在来看下获取许可这个方法,这个方法是在AbstractQueuedSynchronizer类中

 

首先判断该线程是否被中断了,如果没有执行第二个if判断,看下if判断中的tryAcquireShared(arg)方法,跟着这个方法最后会进入到Sync的下面这个方法

 

第一步:获取state的值(state的值在Semaphore初始化的时候我们给定的值)

第二步:将state的值减1,如果在获取许可的方法中没有给定许可的值默认是1,

第三步:1:假如减完后的值 <0,那么只有一种可能,许可证被枪光了 。 2:如果不小于0,那么就利用CAS设置新的值,最后将得到的值返回回去

返回到之前判断的方法

 

如果不小于0,说明还有许可证,所以不做任何操作,如果小于0,说明新的线程进来之后没有拿到许可证,所以会执行 doAcquireSharedInterruptibly(arg);方法

 

先说一下整个方法的大致逻辑:

首先我们要知道能进入到这个方法说明新的线程没有获得许可,所以

第一步:将这个新的线程添加到队列中去(addWaiter())

第二步:获取该节点的上一个节点,如果上个节点是头节点,那么就会再次尝试获取许可,如果获取到了就设置该节点为头节点

第三步:如果上一个节点不是头节点,那么就会使该线程阻塞(在if判断中实现),阻塞的方法就是使用LockSupport.park()实现的

 

那么释放许可就很容易理解了

第一步:释放掉许可,将state的值 +1;

第二步:然后去队列中看是否有等待的元素

第三步:如果有等待的元素那么直接将其唤醒即可,然后让唤醒的线程获取许可(获取许可的源码跟上面一致)

可以自己进源码看看,这里就不放图了

JUC框架 源码解析系列文章目录 JDK8 前言 笔者在接下来这段时间将对JUC框架内的重点内容进行深度解析,由于内容颇多,需要分成多篇文章,所以在这里列一个目录,方便大家翻阅。 目录 JUC框架的基础是CAS和自旋,而CAS则是利用Unsafe类提供的CAS操作,而原子类则依靠于CAS和自旋。下面几篇文章从源码分析JUC框架内的几个重要的原子类。 JUC AtomicInteger源码解析 JDK8 JUC AtomicIntegerArray源码解析 JDK8 JUC AtomicStampedReference源码解析 JDK8 AQS(A 阅读详情

相关推荐

JUC源码解析

JUC包源码解析

llaxw1989的博客 1238

【JUC并发编程】12 Semaphore原理/源码解析

Semaphore原理、Semaphore源码解析

健身变秃,coding变强 1011

微信图片.dat文件解密实战:用Python一键转PNG(附完整代码)

本文详细介绍了如何通过Python解密微信图片.dat文件并转换为PNG格式的完整教程。文章深入解析了微信.dat文件的异或加密原理,提供了自动检测密钥的Python脚本,并分享了批量解密和性能优化的实用技巧,帮助用户轻松恢复和整理微信聊天图片。

weixin_29096377的博客 468

并发编程JUC深度学习(十)Semaphore源码解析

Semaphore源码解析

左灯右行的爱情 395

【TiktokAPI】Tiktok直播API与实时互动功能开发完全指南

Tiktok直播API允许开发者创建、管理直播,并实现各种互动功能。/*** 获取Tiktok直播API访问令牌* @param {string} client_id - 应用ID* @param {string} client_secret - 应用密钥* @param {string} code - 授权码* @param {string} redirect_uri - 重定向URI* @returns {Promise<object>} 访问令牌响应*/try {}),

Mageia的专栏 3210

告别版本冲突!在Ubuntu 20.04上优雅实现ROS Noetic与ROS2 Foxy双环境切换

本文详细介绍了在Ubuntu 20.04系统上实现ROS Noetic(ROS1)与ROS2 Foxy双环境共存与切换的完整方案。通过智能脚本设计和工作空间隔离,解决了版本冲突问题,帮助开发者高效管理不同ROS版本项目。特别适合需要同时开发ROS1和ROS2应用的机器人开发者。

weixin_28452161的博客 411

Java面试题2025-并发编程高级(JUC并发工具及异步编程)

CountDownLatch就是JUC包下的一个工具,整个工具最核心的功能就是计数器。如果有三个业务需要并行处理,并且需要知道三个业务全部都处理完毕了。需要一个并发安全的计数器来操作。CountDownLatch就可以实现。给CountDownLatch设置一个数值。可以设置3。每个业务处理完毕之后,执行一次countDown方法,指定的3每次在执行countDown方法时,对3进行-1。主线程可以在业务处理时,执行await,主线程会阻塞等待任务处理完毕。

卿着飞翔 1427

解锁VS2022!手把手教你本地部署Deepseek

在 VS2022 中本地部署 Deepseek,我们首先需要确保硬件资源的充足,如高性能的 GPU、大容量内存和高速存储等,这是模型稳定运行的基石。如果生成的摘要能够准确概括原文的核心内容,就表明 Deepseek 模型在文本分析方面的功能正常,部署稳定可靠。这对于开发者来说,能够大大提高开发效率,当遇到一些常见的功能实现时,可以借助 Deepseek 模型快速生成基础代码框架,减少手动编写的工作量。在大语言模型的蓬勃发展的当下,Deepseek 凭借其卓越的性能和创新的技术,已然成为该领域的佼佼者。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 1万+

Java实习生------JUC并发编程面试题(ConcurrentHashMap、BlockingQueue、ReetrantLock、semaphore)附源码解析⭐⭐⭐

JUC并发编程面试题汇总,CopyOnWriteArrayList等源码解析

每周更新,热爱coding! 312

基于深度学习YOLOv8的商品识别系统(深度学习 + UI界面 + 训练数据集 + Python代码)

如果使用自定义数据集,可以通过图像标注工具如LabelImg来标注每个商品的类别和边界框,并保存为YOLO格式的文本文件。bash复制编辑/dataset/images/train/val/labels/train/val这样,我们就准备好了数据集,可以开始训练YOLOv8模型。本文介绍了如何使用YOLOv8构建一个商品识别系统,包括从数据准备到模型训练,再到UI界面的开发。通过深度学习技术,尤其是YOLOv8的高效目标检测能力,我们能够快速实现商品识别并集成到实际应用中。

YOLO 303

图神经网络实战(21)——图神经网络的可解释性

在本节中,我们探讨了应用于图神经网络 (Graph Neural Networks, GNN) 的可解释性人工智能 (Explainable Artificial Intelligence, XAI) 技术。可解释性是许多领域的关键要素,可以帮助我们建立更好的模型。我们介绍了不同的局部解释技术,并重点讨论了 GNNExplainer (基于扰动的方法),在图分类任务中应用 GNNExplainer。

盼小辉丶的博客 9608

AQS之hasQueuedPredecessors方法源码分析

AQS之hasQueuedPredecessors方法源码分析 为什么先读取tail,再读取head hasQueuedPredecessors方法false的情况 hasQueuedPredecessors方法true的情况

zqj1172102457的博客 839

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

并发编程笔记八-JUC并发工具应用与源码深度解析

本章讲解了CountDownLatch,CyclicBarrier以及Semaphore三个并发工具类的介绍,应用以及源码的深度解析。相信如果有如ReentrantLock,AQS源码阅读的基础,再读这三个并发工具类的源码其实是没有太多难度的,关键是要耐心去看,去分析,自己画图,自己尝试去写代码注释。

qq_41191331的博客 804

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

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

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

java 中的锁的问题

1. synchonrize如何更好地使用? 谈到这个问题, 主要先从这几个方面来入手: 线程的几种状态synchonrize的几种使用方法比较synchonrize和volatile比较synchonrize和juc中的锁比较用了锁就真的没有并发问题了么? 1.1 线程的几种状态 不熟悉线程的生命周期和相互的转换控制, 是无法写好并发代码的.  图简单易懂,

静水流深 4192

老版QQ原生表情gif动态

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

一文带你读懂AQS

AQS(AbstractQueuedSynchronizer)是Java并发编程的核心框架,提供了一套通用的线程同步机制。它通过原子状态变量(state)和CLH队列实现资源管理,支持独占(如ReentrantLock)和共享(如Semaphore)两种模式。AQS采用模板方法模式,将线程排队、阻塞/唤醒等通用逻辑封装,具体资源获取/释放由子类实现。源码分析显示其核心流程包括:获取资源时先尝试快速获取,失败则进入队列自旋等待;释放资源时唤醒后续节点。AQS还通过ConditionObject实现条件等待机制

qq_844085127的博客 1209

Jdk1.6 JUC源码解析汇总

Jdk1.6 JUC源码解析汇总   Jdk1.6 JUC源码解析(1)-atomic-AtomicXXX   Jdk1.6 JUC源码解析(2)-atomic-AtomicXXXArray   Jdk1.6 JUC源码解析(3)-atomic-AtomicXXXFieldUpdater   Jdk1.6 JUC源码解析(4)-atomic-AtomicStampedRefer...

永远保持敬畏之心 356

Java-AQS深入理解

AQS核心原理与实现机制 AQS(AbstractQueuedSynchronizer)是Java并发包中构建锁和同步器的核心框架。它通过state变量表示同步状态,采用CLH队列管理等待线程,并提供独占和共享两种获取模式。AQS内部维护一个双向链表结构的同步队列和单向链表的条件队列,使用CAS操作保证线程安全。基于模板方法模式,开发者只需实现tryAcquire等特定方法即可构建自定义同步器。ReentrantLock、Semaphore等常用并发工具均基于AQS实现

Khazix的博客 760

Java多线程系列--“JUC锁”08之 共享锁和ReentrantReadWriteLock

概要 Java的JUC(java.util.concurrent)包中的锁包括"独占锁"和"共享锁"。在“Java多线程系列--“JUC锁”02之 互斥锁ReentrantLock ”中,对Java的独占锁进行了说明。本章对Java的“共享锁”进行介绍,JUC中的共享锁有CountDownLatch, CyclicBarrier, Semaphore, ReentrantReadWrit

XINJing的专栏 3872

JUC并发编程

JUC并发编程 JUC简介 进程、线程的关系 Java默认有两个线程 线程的六种状态 并发、并行的关系: Lock锁 Synchronized 和 Lock的区别 8锁现象 问题一 : 在标准情况下,两个线程先打印 发短信 还是 打电话 ? 问题二 : 在发短信方法中,延迟4秒,两个线程先打印 发短信 还是 打电话? 问题三 : Phone类增加一个普通方法,线程B调用,那么两个线程先打印 发短信

识时务者的个人博客 14万+

深入解析Java并发包(JUC)中的Semaphore

Semaphore,即信号量,是操作系统中的一个经典概念。在Java并发包(java.util.concurrent,简称JUC)中,Semaphore类实现了这一概念,用于控制同时访问特定资源的线程数量。与关键字和类不同,Semaphore可以实现更为复杂的线程同步需求,允许一定数量的线程同时访问共享资源。

码到三十五 1万+

JUC 工具类大全:CountDownLatch、Semaphore、CyclicBarrier 有何区别?

摘要:本文深入解析Java并发编程中CountDownLatch、Semaphore和CyclicBarrier三大同步工具。CountDownLatch用于主线程等待子任务完成,基于AQS实现一次性计数;Semaphore通过许可机制控制并发线程数,支持公平/非公平策略;CyclicBarrier实现多线程阶段性同步,支持循环使用和回调机制。文章从源码层面对比三者的实现原理,分析适用场景,并给出使用建议:CountDownLatch适合任务完成通知,Semaphore用于限流,CyclicBarrier适

小健学Java的博客 1747

JUC-Semaphore源码分析

建议阅读Semaphore源码分析之前,先阅读,了解一下Semaphore用处以及基本用法。我们知道Semaphore是一个信号量,在java并发编程中,Semaphore本质上是一个共享锁的,用来限制多线程对共享资源的并发访问的。......

zqj1172102457的博客 423

JUC并发编程之Semaphore应用与源码探究

JUC并发编程之Semaphore应用与源码探究

Eriksen的博客 536

JUC源码解析文章目录

基础知识: 原子操作的实现:CAS与锁 JMM与happens-before Synchronized ThreadLocal 同步器 J.U.C之基——AQS 锁 ReentrantLock Condition CountDownLatch Semaphore CyclicBarrier ReentrantReadWriteLock 并发容器 CopyOnWriteArrayList Conc...

业精于勤荒于嬉 行成于思毁于随 2092
上一篇: 并发编程JUC-CountDownLatch源码解析
下一篇: SpringMVC-HandleMapping的初始化源码分析
加班不秃顶
博客等级 码龄7年 1822粉丝 599原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值