您当前所在位置:首页攻略详解Semaphore信号量的使用和原理

详解Semaphore信号量的使用和原理

更新:2024-04-14 08:54:58编辑:游戏资讯归类:攻略

在前几天写的《基于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游戏-好玩游戏攻略集合版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

悦享APP如何领取优惠券?详细步骤分享 未命名