有钱也得排队-并发工具之Semaphore

 疫情终于快要过去,马上进入后疫情时代,各商业也都活络起来,X作为著名奢侈品牌也宣布开业,小白应邀做起了X品牌店铺的保安。

    开业当天,人潮汹涌,但是店铺的承载能力有限,小白想到一个对策,就是站在门口发通行证,通行证的总数有限,进店需要拿着通行证,出去的时候归还,如果通行证都发放出去,就让新来的人去排队,有新的通行证时就大吼一声,让大家拿证进店。

下图为动画演示-非公平模式:

    这种模式用了一段时间遭到顾客投诉,“凭什么不排队的顾客能先进入”。其实这种就是典型的Semaphore的非公平模式的实现,首先定义Semaphore,设置限制令牌数permits=4,放出令牌时,队列头及新来的都能争抢令牌。当剩余令牌remaining=0时,新来的会排到队尾。

    对于这种不公平的情况,小白采用了一种新的模式,remaining>0时,消费者可以拿令牌进入,remaining=0时,消费者进入队列,令牌再次放出时,新来的消费者也需要进入队列尾部。队列头部的消费者拿令牌进入。

如下图所示-公平模式:

 

1.代码实现

下面这个程序中是非公平的实现。

把 // Shop shop = shopping.new Shop(true); 这个注释打开即为公平模式。

import java.util.ArrayList;import java.util.List;import java.util.concurrent.Semaphore;public class Shopping {
      public static void main(String[] args) {
          Shopping shopping = new Shopping();        //消费者        List<Consumer> consumerList = new ArrayList<>();        for(int i=0;i<30;i++){
               consumerList.add(shopping.new Consumer(i+"号"));        }        // 某奢侈品牌开业,接待消费者,非公平        Shop shop = shopping.new Shop(false);        // 公平        // Shop shop = shopping.new Shop(true);                shop.startBusiness(consumerList);    }    /**消费者*/    class Consumer{
          private final String name;        Consumer(String name) {
              this.name = name;        }        // 进行购物        public void shop() {
              try {
                  Thread.sleep(1000);            } catch (InterruptedException e) {
                  e.printSta
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值