java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Semaphore信号量

Java中的Semaphore信号量简单使用代码实例

作者:暴躁的程序猿啊

这篇文章主要介绍了Java中的Semaphore信号量简单使用代码实例,Semaphore是用来保护一个或者多个共享资源的访问,Semaphore内部维护了一个计数器,其值为可以访问的共享资源的个数,一个线程要访问共享资源,需要的朋友可以参考下

Semaphore信号量

Semaphore是用来保护一个或者多个共享资源的访问,Semaphore内部维护了一个计数器,其值为可以访问的共享资源的个数。

一个线程要访问共享资源,先获得信号量,如果信号量的计数器值大于1,意味着有共享资源可以访问,则使其计数器值减去1,再访问共享资源。

如果计数器值为0,线程进入休眠。当某个线程使用完共享资源后,释放信号量,并将信号量内部的计数器加1,之前进入休眠的线程将被唤醒并再次试图获得信号量。 例如:停车场的车位 ,有空闲车位才可以停,没有空闲车位只能等待。 主要使用方法:

acquire() 从信号量获取一个许可,在提供一个许可之前一直将线程阻塞 否则线程被中断

release() 释放一个许可,将其返回给信号量

例子: 停车场有五个停车位 有十辆车要停

public class SemaphoreDemo {
    public static void main(String[] args) {
        //参数 许可数量  例有五个空停车位
        Semaphore semaphore = new Semaphore(5);
        //模拟10辆汽车  要停车  只能有五辆汽车同时停  其他车只能等待
        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                try {
                    //acquire()得到  成功拿到车位停车
                    semaphore.acquire();
                    System.out.println(Thread.currentThread().getName() + "抢到车位");
                    //停两秒钟的车
                    TimeUnit.SECONDS.sleep(2);
                    //离开车位
                    System.out.println(Thread.currentThread().getName() + "离开车位");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    //release()释放
                    semaphore.release();
                }
            }).start();
        }
    }
}

在这里插入图片描述

到此这篇关于Java中的Semaphore信号量简单使用代码实例的文章就介绍到这了,更多相关Semaphore信号量内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文