Semaphore 可以理解为一个阈值,正在进行的操作数量不能超过此阈值,可以用来限制资源的访问,或者控制某个队列中对象的个数,也就是控制同时执行的线程的数量。

主要有acquire,release两个方法,第一个是获得锁,拿到锁之后线程继续往下执行,否则等待,release方法是释放锁,这样其他等待线程可以获得锁。

public class SemaphoreTest {private Semaphore semaphore = new Semaphore(2);public void m() {try {System.out.println(Thread.currentThread().getName()+" started");semaphore.acquire();Thread.sleep((int) (Math.random() * 2000));} catch (InterruptedException e) {e.printStackTrace();} finally {semaphore.release();}System.out.println(Thread.currentThread().getName()+" ended");}public static void main(String[] args) {SemaphoreTest test = new SemaphoreTest();for (int i=0;i<8; i++) {new Thread(()->test.m()).start();}}
}

Java 并发编程之同步工具类信号量 Semaphore相关推荐

  1. Java 并发编程之同步工具类闭锁 CountDownLatch

    Java 同步工具类CountDownLatch相当于一个计数器,假设一个方法,等待一个计数器从初始值5变为0,每使用一次countdown()方法,计数器的值减少1,当计数器的值为0时,触发某件事. ...

  2. Java 并发编程之同步工具类 Exchanger

    Exchanger 交换器,用于两个线程之间交换数据. 线程1调用exchange()方法,然后进行线程阻塞,等待线程2调用exchange()方法交换数据,线程2调用exchange()方法后,两个 ...

  3. Java 并发编程之同步工具类栅栏 CyclicBarrier

    CyclicBarrier 用来阻塞一组线程,等待线程完成后才开始某件事情. 例如,开启5个线程,每个线程使用await方法开始阻塞,等待5个线程都完成,才开始执行await方法后面的代码. publ ...

  4. Java并发中常用同步工具类

    为什么80%的码农都做不了架构师?>>>    同步工具类可以是任何一个对象,只要它根据其自身的状态来协调线程控制流.阻塞队列(BlockingQueue)可以作为同步工具类,其他类 ...

  5. Java高并发编程:同步工具类

    内容摘要 这里主要介绍了java5中线程锁技术以外的其他同步工具,首先介绍Semaphore:一个计数信号量.用于控制同时访问资源的线程个数,CyclicBarrier同步辅助类:从字面意思看是路障, ...

  6. java并发编程学习juc工具类之Executors

    文章目录 Executors 重要方法 1.newCachedThreadPool 2.newFixedThreadPool 3.newScheduledThreadPool 示例代码 4.newSi ...

  7. Java并发编程:CountDownLatch、CyclicBarrier和Semaphore

    2019独角兽企业重金招聘Python工程师标准>>> Java并发编程:CountDownLatch.CyclicBarrier和Semaphore 在java 1.5中,提供了一 ...

  8. java并发基础(二)--- Java监视器模型、并发容器、同步工具类(闭锁、信号量)

    原blog链接:http://www.cnblogs.com/peterxiao/p/6921903.html 总结一下第4.5章的东西. 一.java监视器模式 概念:把对象的所有可变状态都封装起来 ...

  9. Java并发编程:同步容器

    为了方便编写出线程安全的程序,Java里面提供了一些线程安全类和并发工具,比如:同步容器.并发容器.阻塞队列.Synchronizer(比如CountDownLatch).今天我们就来讨论下同步容器. ...

最新文章

  1. 开源性能监控工具APM之Skywalking和Pinpoint的实测对比
  2. ffmpeg Windows Error 0xe06d7363
  3. java 倒计时_java倒计时器
  4. FPGA课程设计使用VHDL语言
  5. asp.net core 使用Mysql和Dapper
  6. PHP 如何判断当前用户已在别处登录
  7. python中seek(10、1)_Python中index()和seek()的用法(详解)
  8. 轻松解决U盘拷贝文件时提示文件过大问题
  9. xsos:一个在Linux上阅读SOSReport的工具
  10. 计算机包括台式机和笔记本,笔记本电脑与台式机怎样连接
  11. threejs学习05-OimoPhysics模型的物理特性
  12. 流利阅读 2019 1.6 What happened at Theranos is a dazzling story of deception
  13. 逃避追债?贾跃亭把法拉第未来股权转给了外甥,但他还有5套豪宅! | 焦点
  14. 网易AI出席2018世界人工智能大会,带来沉浸式交互体验
  15. Python添加下拉菜单
  16. 通过meta代码强制浏览器使用WebKit内核极速模式
  17. 【转载】SpringBoot 接口数据加解密技巧,so easy!
  18. 数据库mysql---NUMERIC数据类型
  19. java对文件进行压缩的两种方法
  20. 霍尔电流传感器在直流列头柜的应用

热门文章

  1. 【英语学习】【医学】Unit 01 The Skeletal System
  2. 自定义控件之绘图篇(一):概述及基本几何图形绘制
  3. C开源hash代码uthash的用法总结(1)
  4. OpenSSL的Heartbleed漏洞原理及简单模拟
  5. 固件是通用的吗_如何升级AirPods固件?
  6. 大华的支持rtmp推流吗_海康大华DSS视频拉流-RTSP转RTMP多媒体播放技术
  7. xp系统mysql安装教程视频教程_Windows XP操作系统下的MYSQL安装过程_PHP教程
  8. 简单易懂设计模式——简单工厂模式
  9. C# Monitor实现
  10. 黄聪:Discuz自制模板带jquery时与discuz本身冲突解决办法