【Semaphore】

Semaphore信号量:控制同时访问某个特定资源的操作数量。
常用方法:
acquire 方法。获取一个许可证,获取不到就阻塞等待。

acquire(int permits)。一次获取 permits 个许可证。

tryAcquire()。它会尝试获取一个许可证,如果许可证可用,它会立即获取许可证并返回true,表示成功获取;如果许可证不可用,tryAcquire()方法会立即返回false,而不会阻塞线程。线程可以根据返回值来判断是否成功获取许可证。

tryAcquire(int permits)。尝试获取 permits 个许可证,获取到返回 true,获取不到返回 false。

tryAcquire(int timout, TimeUnit unit)。等待一段时间获取一个许可证,如果获取到了就返回 true,获取不到就返回 false。

tryAcquire(int permits, int timout, TimeUnit unit)。等待一段时间获取 permits 个许可证,如果获取到了就返回 true,获取不到就返回 false。

release()。归还一个令牌到令牌桶。

release(int permits)。归还 permits 个令牌到令牌桶。

acquireUninterruptibly。阻塞式获取一个许可证,不可被中断。

acquireUninterruptibly(int permits)。阻塞式获取 permits 个许可证,不可被中断。

availablePermits。返回当前可用的许可的数量。

public class SemaphoreTest {
    private final List<String> list;
    private final Semaphore semaphore;

    public SemaphoreTest(int bound) {
        this.list = Collections.synchronizedList(new ArrayList<>());
        this.semaphore = new Semaphore(bound);
    }

    public void add(String str) throws InterruptedException {
        // 获取一个许可证
        semaphore.acquire();
        System.out.println(str + "获取一个许可证");
        list.add(str);
        System.out.println("向集合添加数据:" + str);
    }

    public void remove(String str) {
        boolean flag = list.remove(str);
        if (flag) {
            System.out.println("移除元素:" + str);
            semaphore.release();
        }
    }

    public static void main(String[] args) {
        // 设置两个凭证,每添加一次消耗一个凭证,当凭证获取完后,需要有新元素移除并释放凭证后才能添加
        SemaphoreTest semaphoreTest = new SemaphoreTest(2);
        try {
            semaphoreTest.add("AAA");
//          semaphoreTest.remove("AAA");
            semaphoreTest.add("BBB");
            semaphoreTest.add("CCC");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

输出结果为:
AAA获取一个许可证
向集合添加数据:AAA
BBB获取一个许可证
向集合添加数据:BBB

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值