详解Semaphore信号量的使用和原理
在前几天写的《基于AQS手写一个同步器》中,很多同学留言称里面提到的Semaphore讲得太笼统了。今天趁着周末有空,我们就一起详细学习和梳理一下Semaphore。
Semaphore是一个用来控制同时访问特定资源的线程数量的工具。在多线程同时操作共享资源时,仍然存在着线程不安全问题,因此需要结合锁来进一步保障多线程安全。
信号量的主要结构包括两个方法:acquire()和release()。acquire()用于获取许可,而release()用于释放许可。

在Semaphore中,acquire()方法内部调用了AQS的acquireSharedInterruptibly()方法,而release()方法内部则调用了AQS的releaseShared()方法。这两个方法的具体实现在Semaphore的两个静态内部类FairSync(公平模式)和NonfairSync(非公平模式)中。
在FairSync中,调用acquire()方法的顺序就是获取许可证的顺序,遵循FIFO;而在NonfairSync中,默认为非公平模式,采用抢占式的方式。
Semaphore的使用示例:
public class Test {
private final Semaphore semaphore;
public Test(int acq){
this.semaphore= new Semaphore(acq);
}
public void useSemaphore(){
try {
semaphore.acquire();
System.out.println("资源开始使用了 " + Thread.currentThread().getName());
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release();
System.out.println("资源释放了 " + Thread.currentThread().getName());
}
}
public static void main(String[] args) {
Test test = new Test(3);
for (int i = 0; i < 5; i++) {
new Thread(test::useSemaphore).start();
}
}
}
输出:
资源开始使用了 Thread-0
资源开始使用了 Thread-1
资源开始使用了 Thread-3
资源释放了 Thread-0
资源开始使用了 Thread-2
资源开始使用了 Thread-4
资源释放了 Thread-1
资源释放了 Thread-3
资源释放了 Thread-4
资源释放了 Thread-2
如果本篇博客对您有一定的帮助,欢迎留言、点赞和收藏。转载请联系Build哥。

如果您想与Build哥的关系更近一步,还可以关注“JavaBuild888”,在这里除了看到《Java成长计划》系列博文,还有提升工作效率的小笔记、读书心得、大厂面经、人生感悟等内容,欢迎您的加入。

以上就是电脑114游戏给大家带来的关于详解Semaphore信号量的使用和原理全部内容,更多攻略请关注电脑114游戏。
电脑114游戏-好玩游戏攻略集合版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!