基于CAS的一些锁(6)- Semaphore

基本概念

Semaphore 信号标的意思,作用其实就是限流,构造方法中可以传一个参数permits表示允许同时执行线程的数量。也可看成是信号标、许可标记的数量。

semaphore.acquire()是阻塞方法,获取不到信号标就阻塞,获取到的话信号标permits会减1。

比如Semaphore semaphore = new Semaphore(1),一个线程semaphore.acquire()成功后,许可标记1会变成0,这时其它线程无法获得许可标记,acquire()方法会阻塞。当线程执行完后必须手动semaphore.release()释放标记,这时许可标记会从0变成1,其它线程acquire()到后可以继续执行。

举个栗子

举个例子,比如去窗口买票,new Semaphore(3)就表示有3个窗口,一个人抢先到了某个窗口前就表示acquire到了许可。3个窗口占满后别人只能等着,等有人买完票让出窗口release后才能占住窗口买票。

Semaphore默认是非公平的,new Semaphore(2, true) 第二个参数为true可设置成公平的。
公平就是有队列在那里等,需要执行的线程要先排队。用收费站来举例,假如有四辆车都在等着进一个车道,当后面再来一辆的时候,它不会超到前面去,而是要在后面排着,这叫公平。

内部实现公平锁用的AQS

所以说内部是有队列的。此外reentrantlock、CountDownLatch、CyclicBarrier、Phaser、ReadWriteLock、Semaphore、Exchanger都是用同一个队列,同一个类来实现的,这个类叫AQS。

示例程序

public class T06_Semaphore {

    public static void main(String[] args) {

        Semaphore semaphore = new Semaphore(2, true);
        // Semaphore semaphore = new Semaphore(1); // 允许一个线程同时执行

        new Thread(() -> {
            try {
                semaphore.acquire();
                System.out.println("thread1 start...");
                TimeUnit.SECONDS.sleep(1);
                System.out.println("thread1 end...");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                semaphore.release();
            }
        }).start();

        new Thread(() -> {
            try {
                semaphore.acquire();
                System.out.println("thread2 start...");
                TimeUnit.SECONDS.sleep(1);
                System.out.println("thread2 end...");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                semaphore.release();
            }
        }).start();
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值