疫情终于快要过去,马上进入后疫情时代,各商业也都活络起来,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