面试官: Semaphore在项目中有使用过吗?说说看(源码剖析)
前言
目前正在出一个Java多线程专题长期系列教程,从入门到进阶含源码解读, 篇幅会较多, 喜欢的话,给个关注❤️ ~
Java提供了一些非常好用的并发工具类,不需要我们重复造轮子,本节我们讲解Semaphore,一起来看下吧~
Semaphore
它就是我们之前在讲源码的时候提到的信号量,下面看下它的构造函数
private void unparkSuccessor(Node node) {
int ws = node.waitStatus;
if (ws < 0)
compareAndSetWaitStatus(node, ws, 0);
Node s = node.next;
if (s == null || s.waitStatus > 0) {
s = null;
for (Node t = tail; t != null && t != node; t = t.prev)
if (t.waitStatus <= 0)
s = t;
}
if (s != null)
LockSupport.unpark(s.thread);
}
可以看到在unparkSuccessor中进行了锁的释放,这个过程发生在释放阶段
release()相对简单一些,大家可以自己对着源码看下,实现有些类似
结束语
其实本节带大家看源码,主要是想给大家讲下共享锁的知识,Semaphore其实就是使用了共享锁。另外AQS这个类很值得大家好好研究一下,你会发现很多的好用的类都是基于它实现,之前我们讲源码的时候也都遇到了,有兴趣可以了解一下。下节给大家讲下Exchanger ~
往期内容推荐
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
我的博客(阅读体验较佳)
-
-
-
-
-
项目源码(源码已更新 欢迎star⭐️)
-
java-thread-all
-
地址: https://github.com/qiuChengleiy/java-thread-all.git
推荐 SpringBoot & SpringCloud (源码已更新 欢迎star⭐️)
-
springboot-all
-
地址: https://github.com/qiuChengleiy/springboot-all.git -
-

本篇文章来源于微信公众号: 程序员皮卡秋
微信扫描下方的二维码阅读本文

Comments NOTHING