我靠!Semaphore里面居然有这么一个大坑! (1)

简介: 我靠!Semaphore里面居然有这么一个大坑! (1)

荒腔走板


大家好,我是why哥 ,欢迎来到我连续周更优质原创文章的第 59 篇。


上周写了一篇文章,一不小心戳到了大家的爽点,其中一个转载我文章的大号,阅读量居然突破了 10w+,我也是受宠若惊。


但是其实我是一个技术博主来的,偶尔写点生活相关的。所以这篇还是回到技术上。


但是我的技术文章有个特点是第一张图片都是我自己拍的。然后我会围绕这个图片进行一个简短的描述,我称之为荒腔走板环节。


目的是给冰冷的技术文注入一丝色彩。


我这样做已经坚持了很多篇 ,有的读者给我说:看完荒腔走板部分就退出去了。


那你们是真的棒哦,至少退出去之前,拉到文末,来个一键三连吧,给我来点正反馈。


好了,先说说这期的荒腔走板。


上面这个图片是我上周末看《乐队的夏天》的时候拍的。


这个乐队的名字叫做水木年华,我喜欢这个乐队。


我听他们的歌的时候,应该是初中,那个时候磁带已经差不多快过气了,进入了光碟的时代,我记得一张光碟里面有好几十首歌,第一次在 DVD 里面听到他们的歌是《一生有你》,听到这首歌的时候就感觉很干净,很惊艳。


然后一字一句抄在自己的歌词本上。


听到这首歌的那个周末,我就看着那个 MV 反复学,那时的 DVD 有个功能是可以 A-B 反复播放某个片段,我就一句一句的学,学会了这首歌。


那时候的李健,一双清澈明亮的大眼睛,就像一汪湖水,我一个小男孩,都好想在他的眼睛里扎个猛子。


这首歌,我愿称之为校园民谣的巅峰之一。


十多年后的今天,这个乐队重新出现在我的视野中,只是李健已经不再其中。


他们在乐夏的舞台上唱了一首《青春再见》,结果被一个自称 23 岁的胖小伙说“中年人的油腻”,被另个专业乐迷说:“四十多岁的人怎么还在唱青春再见?”。第一期就被淘汰出局。


这操作,看的我一愣一愣的。


这个怎么就油腻了?四十多岁的人怎么就不能唱青春再见了?男人至死都是少年你们不知道吗?小子,他们玩音乐的时候你还不会说话呢。


他们离开舞台的画面,我感觉到一丝辛酸,一丝真的青春再见的辛酸。


水木年华没有错,错的是这个舞台,这个舞台不适合他们的歌曲。

好了,说回文章。


一起看个问题


前几天有个读者给我发了一个链接,说这个链接里面的代码,为什么会这样运行,实在是没有搞懂是怎么回事,链接如下:


https://springboot.io/t/topic/1139



image.png


代码是这样的,给大家上个图:


微信图片_20220426203241.png


image.png


不知道为什么代码里面给了一个 2。但是为了保证真实,我直接拿过来了,没有进行改动。一会我会根据这个代码进行简单的修改。


知道 semaphore 是干啥的同学可以先看看上面的代码,为什么造成了“死锁”。


反正是一个非常无语的低级错误,但是我反复看了几遍居然没有看出来。


不知道 semaphore 是干啥的同学,看过来。我先给你科普一下。


semaphore 我们一般叫它信号量,用来控制同时访问指定资源的线程数量


如果不懂 semaphore ,那上面代码你也看不懂了,我按照代码的逻辑给你举个例子。


比如一个高端停车场,只有 3 个车位。(这就是“指定资源”)


现在里面没有停车,那么它最多可以停几辆车呢?


是的,门口的剩余车辆指示牌显示:剩余停车位 3 辆。


这个时候,有三路人想要过来停车。


三条路分别是:转发路、点赞路、赞赏路。



image.png


路上的车分别是 why 哥的劳斯莱斯、赵四的布加迪、刘能、谢广坤这对好基友开的法拉利:


image.png


这个时候从“点赞路”过来的赵四先开到了,于是停了进去。


门口的停车位显示:剩余停车位 2 辆。


image.png


image.png


image.png


image.png


上面的代码想要描述的就是这样的一个事情。


但是根据提问者的描述,“在运行时,有时只会执行完线程A,其线程B和线程C都静默了。”


在上面这个场景中就是:赵四的布加迪开进去停车后,后面刘能、谢广坤的法拉利和我的劳斯莱斯都停不进去了。


就是这样式儿的:


image.png

目录
相关文章
|
3月前
|
安全 Java 开发者
Java多线程同步:synchronized与Lock的“爱恨情仇”!
Java多线程同步:synchronized与Lock的“爱恨情仇”!
87 5
|
3月前
|
Java 开发者
解锁Java并发编程的秘密武器!揭秘AQS,让你的代码从此告别‘锁’事烦恼,多线程同步不再是梦!
【8月更文挑战第25天】AbstractQueuedSynchronizer(AQS)是Java并发包中的核心组件,作为多种同步工具类(如ReentrantLock和CountDownLatch等)的基础。AQS通过维护一个表示同步状态的`state`变量和一个FIFO线程等待队列,提供了一种高效灵活的同步机制。它支持独占式和共享式两种资源访问模式。内部使用CLH锁队列管理等待线程,当线程尝试获取已持有的锁时,会被放入队列并阻塞,直至锁被释放。AQS的巧妙设计极大地丰富了Java并发编程的能力。
45 0
|
4月前
|
安全 数据库连接 数据库
(六)手撕并发编程之基于Semaphore与CountDownLatch分析AQS共享模式实现
在上篇文章《深入剖析并发之AQS独占锁&重入锁(ReetrantLock)及Condition实现原理》中我们曾基于ReetrantLock锁分析了AQS独占模式的实现原理,本章则准备从Semaphore信号量的角度出发一探AQS共享模式的具体实现。共享模式与独占模式区别在于:共享模式下允许多条线程同时获取锁资源,而在之前分析的独占模式中,在同一时刻只允许一条线程持有锁资源。
|
3月前
|
算法 Java 调度
【多线程面试题二十】、 如何实现互斥锁(mutex)?
这篇文章讨论了在Java中实现互斥锁(mutex)的两种方式:使用`synchronized`关键字进行块结构同步,以及使用`java.util.concurrent.locks.Lock`接口进行非块结构同步,后者提供了更灵活的同步机制和扩展性。
|
6月前
|
Java 数据库
Semaphore(信号量)源码解读与使用
Semaphore(信号量)源码解读与使用
|
设计模式 安全 Java
JUC第十二讲:JUC锁 - 看不懂锁核心类 AQS 原理来打我
JUC第十二讲:JUC锁 - 看不懂锁核心类 AQS 原理来打我
|
机器学习/深度学习
十九、信号量和管程
十九、信号量和管程
十九、信号量和管程
我靠!Semaphore里面居然有这么一个大坑! (3)
我靠!Semaphore里面居然有这么一个大坑! (3)
270 0
我靠!Semaphore里面居然有这么一个大坑! (3)
我靠!Semaphore里面居然有这么一个大坑! (2)
我靠!Semaphore里面居然有这么一个大坑! (2)
85 0
我靠!Semaphore里面居然有这么一个大坑! (2)
|
Java
我靠!Semaphore里面居然有这么一个大坑! (4)
我靠!Semaphore里面居然有这么一个大坑! (4)
110 0
我靠!Semaphore里面居然有这么一个大坑! (4)