Semaphore使用过吗

    Semaphore,信号灯,也叫信号量,主要用于两个目的,一个是用于多个共享资源的互斥使用,另一个用于并发线程数的控制,大家想一个生活中的例子,我们开车去超市买东西的时候,首先要把车停到超市的停车场中,停车场的车位是有限的,假设停车场有3个停车位,来了6辆车,总会有3辆车先抢到,后面的3辆车等待前边的3辆车开走后,才可以进入停车场停车,也就是java中多个线程抢多份有限的资源,我们来看一下6辆车抢三个停车位的demo。

import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

public class SemaphoreDemo {

    public static void main(String[] args) throws Exception {

        Semaphore semaphore = new Semaphore(3);

        for (int i = 1; i < 7; i++) {

            new Thread(() -> {
                try {
                    semaphore.acquire();
                    System.err.println(Thread.currentThread().getName() + "\t抢到车位");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                try {
                    TimeUnit.SECONDS.sleep(3);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.err.println(Thread.currentThread().getName() + "\t停了3秒后离开车位");
                semaphore.release();

            }, "第" + i + "辆车").start();
        }

    }

}

    执行结果

第6辆车    抢到车位
第1辆车    抢到车位
第4辆车    抢到车位
第6辆车    停了3秒后离开车位
第2辆车    抢到车位
第1辆车    停了3秒后离开车位
第3辆车    抢到车位
第4辆车    停了3秒后离开车位
第5辆车    抢到车位
第2辆车    停了3秒后离开车位
第3辆车    停了3秒后离开车位
第5辆车    停了3秒后离开车位

    demo中,初始化3个资源的Semaphore类,当线程抢到资源后,需要调用acquire方法,当处理完成后,再调用release方法,释放锁,通知其他线程,这样就完成了多个线程抢占多个资源的例子,怎么样,不是很复杂把。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值