Semaphore(信号量)-允许多个线程同时访问

Semaphore(信号量)-允许多个线程同时访问

synchronized 和 ReentrantLock 都是一次只允许一个线程访问某个资源,Semaphore(信号量)可以

指定多个线程同时访问某个资源。

示例代码如下:

/**

* @Description: 需要一次性拿一个许可的情况

*/

public class SemaphoreExample1 {

// 请求的数量

private static final int threadCount = 550;

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

// 创建一个具有固定线程数量的线程池对象(如果这里线程池的线程数量太少的话你会发现执行得很

慢)

ExecutorService threadPool = Executors.newFixedThreadPool(300);

// 一次只能允许执行一次线程数量。

final Semaphore semaphore = new Semaphore(20);

for (int i = 0; i < threadCount; i++) {

final int threadnum = i;

threadPool.execute(() -> {// Lambda 表达式的运用

try {

semaphore.acquire();// 获取一个许可,所以可运行线程数量为20/1=20test(threadnum);

semaphore.release();// 释放一个许可

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

});

}

threadPool.shutdown();

System.out.println(“finish”);

}

public static void test(int threadnum) throws InterruptedException {

Thread.sleep(1000);// 模拟请求的耗时操作

System.out.println(“threadnum:” + threadnum);

Thread.sleep(1000);// 模拟请求的耗时操作

}

}

执行 acquire 方法阻塞,直到有一个许可证可以获得然后拿走一个许可证;每个 release 方法增加一个许可证,这可能会释放一个阻塞的信息 acquire 方法。然而,其实并没有实际的许可证这个对象,Semaphore 只是维持了一个可获得许可证的数量。 Semaphore 经常用于限制获取某种资源的线程数量。

当然一次也可以一次拿取和释放多个许可,不过一般没有必要这样做:

semaphore.acquire(5);// 获取5个许可,所以可运行线程数量为20/5=4

test(threadnum);semaphore.release(5);// 获取5个许可,所以可运行线程数量为20/5=4

除了 acquire 方法之外,另一个比较常用的与之对应的方法是 tryAcquire 方法,该方法如果获取不到许可就立即返回 false。Semaphore 有两种模式公平模式和非公平模式。

公平模式: 调用 acquire 的顺序就是获取许可证的顺序,遵循 FIFO;

非公平模式: 抢占式的。

Semaphore 对应的两个构造方法如下:

public Semaphore(int permits) {

sync = new NonfairSync(permits);

}

public Semaphore(int permits, boolean fair) {

sync = fair ? new FairSync(permits) : new NonfairSync(permits);

}

这两个构造方法,都必须提供许可的数量,第二个构造方法可以指定是公平模式还是非公平模式,默认非公平模式。

【关注】转发了解更多内容,方便后续查看

郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
(0)
用户投稿
上一篇 2022年7月4日
下一篇 2022年7月4日

相关推荐

  • 现代新出的MPV库斯途怎么样?

    最近刚去试驾过,说说我的感受: 1. 驾驶MPV一般很容易开出像货车般的感觉,但是这车开着非常轻巧更像是SUV,日常驾驶或者家庭出游都能HOLD得住。2. 这车中控屏很万能,可以一…

    2022年7月24日
  • Linux安装Docker、K8s(环境准备和Docker安装)

    1. 环境准备 1.1 在Windows上使用VMware规划三Linux系统,且能互相通信。推荐配置如下: CPU 2core master 192.168.xxx.xxx 内存…

    2022年6月25日
  • 某女子网购iPhone 13 Pro 回家检查后发现系统是安卓

    【CNMO新闻】网购的出现,便利了人们的日常生活,人们可以足不出户就能够购买到全国各地的产品。但是,由于网购看不到实物,也常常会出现各种问题。近日,有媒体报道,来自湖北的刘女士网购…

    2022年6月14日
  • 《宝可梦传说阿尔宙斯》捕获率怎么提高?捕获率提高方法介绍

    宝可梦传说阿尔宙斯是一款宝可梦系列的开放世界冒险游戏,很多小伙伴可能还不清楚游戏中怎么提高我们抓精灵的捕获率吧,今天小编给大家带来宝可梦传说阿尔宙斯捕获率提高方法介绍,快来看一下吧…

    2022年11月17日
  • Spring @Async的异常处理

    楼主在前面的2篇文章中,分别介绍了Java子线程中通用的异常处理,以及Spring web应用中的异常处理。链接如下: Java子线程中的异常处理(通用) Spring Boot应…

    2022年6月22日
  • 去跳蚤最简单的方法(屋里有跳蚤怎么样才能最快去除)

    跳蚤是小型无翅、善跳跃的寄生性节肢动物,通常寄生在哺乳类动物身上,雌雄均吸血,危害人体健康和宠物健康,那么怎么去跳蚤呢?下面就为大家介绍去跳蚤最简单的方法。 1.柠檬喷雾 将柠檬切…

    2022年4月20日
  • 新一代“安卓表皇”OPPO Watch 3 系列正式开售:首发骁龙 W5

    8 月 10 日,OPPO Watch 3 系列智能手表正式发布,其首发了骁龙 W5+Apollo 4 Plus 旗舰双芯,具备 UDDE 双擎混动 2.0,也是国内首款搭载 LT…

    2022年8月20日
  • 新能源赛道持续火爆,上市公司接连跨界入局

    6月24日,资本邦了解到,近期,新能源概念热度不断,诸多公司跃跃欲试,尝试入局“分一杯羹”。 6月17日,“养猪大户”正邦科技宣布与国家电力投资集团有限公司浙江分公司签订了《“碳中…

    2022年6月28日
  • 《魔兽世界》怀旧服WLK毫无防备成就获得方法 WLK毫无防备成就怎么获得

    近日,随着怀旧服WLK版本的上线,许多新副本和新成就在等待玩家轮流完成。很多玩家不知道怀旧服WLK毫无防备成就怎么获得,小编给大家收集WOW怀旧服WLK毫无防备成就获得方法,希望能…

    2022年10月12日
  • 大家相信街边那些摆摊算命的么?

    对这个问题我有两个故事讲给大家听,这都是真实的,两个故事我讲给大家听后,大家都觉得是个大笑话。第一个是发生在我们临沂城内的故事,这个故事以有二十多年了,聊起此方面的事情我便讲一回。…

    2022年6月30日

联系我们

联系邮箱:admin#wlmqw.com
工作时间:周一至周五,10:30-18:30,节假日休息