乐趣区

java-Semaphore

Semaphore 简介

Semaphore 是一种基于计数的信号量。它可以设定一个阈值,基于此,多个线程竞争获取许可信号,做自己的申请后归还,超过阈值后,线程申请许可信号将会被阻塞。Semaphore 可以用来构建一些对象池,资源池之类的,比如数据库连接池,我们也可以创建计数为 1 的 Semaphore,将其作为一种类似互斥锁的机制,这也叫二元信号量,表示两种互斥状态。它的用法如下:
availablePermits 函数用来获取当前可用的资源数量
wc.acquire(); // 申请资源
wc.release();// 释放资源

public Semaphore(int permits,boolean fair)
permits: 初始化可用的许可数目。
fair: 若该信号量保证在征用时按 FIFO 的顺序授予许可,则为 true,否则为 false;

例子

餐厅 2 个座位,但是有 3 个人要等位就餐

public class SemaphoreThread extends Thread {
    private String name;
    private Semaphore semaphore;

    public SemaphoreThread(String name, Semaphore semaphore) {
        this.name = name;
        this.semaphore = semaphore;
    }

    @Override
    public void run() {if (semaphore.availablePermits() <= 0) {System.out.println(name + "等位中。。。");
        }
        try {semaphore.acquire();
            System.out.println(name + "开始就餐了。。");
            Thread.sleep(new Random().nextInt(1000));
        } catch (InterruptedException e) {e.printStackTrace();
        }
        System.out.println(name + "吃完了。。");
        semaphore.release();}
}

请求:

@RequestMapping("test-semaphore")
    public void testSemaphore() {Semaphore semaphore = new Semaphore(5);
        for (int i = 1; i <= 10; i++) {new SemaphoreThread("第" + i + "个人", semaphore).start();}
    }

结果:
第 1 个人开始就餐了。。
第 2 个人开始就餐了。。
第 3 个人等位中。。。
第 1 个人吃完了。。
第 3 个人开始就餐了。。
第 2 个人吃完了。。
第 3 个人吃完了。。

退出移动版