Semaphore 直译是信号量,它的功能比较好理解,就是通过构造函数设定一个数量的许可,然后通过 acquire 方法获得许可,release 方法释放许可。它还有 tryAcquire 和 acquireUninterruptibly 方法,可以根据自己的需要选择。
以下是模拟一个连接池,控制同一时间最多只能有50个线程访问,主线程每毫秒创建一个子线程,连接池50个许可,每个获取连接的子线程持球300ms,连接等待超时500ms。

import java.util.UUID;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;public class TestSemaphore extends Thread {public static void main(String[] args) {int i = 0;while (i < 500) {i++;new TestSemaphore().start();try {Thread.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}}}/**
     * 控制某资源同时被访问的个数的类 控制同一时间最后只能有50个访问
     */static Semaphore semaphore = new Semaphore(50);static int timeout = 500;public void run() {try {Object connec = getConnection();System.out.println("获得一个连接" + connec);Thread.sleep(300);releaseConnection(connec);} catch (InterruptedException e) {e.printStackTrace();}}public void releaseConnection(Object connec) {/* 释放许可 */semaphore.release();System.out.println("释放一个连接" + connec);}public Object getConnection() {try {/* 获取许可 */boolean getAccquire = semaphore.tryAcquire(timeout, TimeUnit.MILLISECONDS);if (getAccquire) {return UUID.randomUUID().toString();}} catch (InterruptedException e) {e.printStackTrace();}throw new IllegalArgumentException("timeout");}
}

转载于:https://www.cnblogs.com/suxuan/p/4948755.html

Java并发编程-信号量相关推荐

  1. Java并发编程实战————Semaphore信号量的使用浅析

    引言 本篇博客讲解<Java并发编程实战>中的同步工具类:信号量 的使用和理解. 从概念.含义入手,突出重点,配以代码实例及讲解,并以生活中的案例做类比加强记忆. 什么是信号量 Java中 ...

  2. Java并发编程71道面试题及答案

    Java并发编程71道面试题及答案 1.在java中守护线程和本地线程区别? java中的线程分为两种:守护线程(Daemon)和用户线程(User). 任何线程都可以设置为守护线程和用户线程,通过方 ...

  3. Java并发编程:JMM和volatile关键字

    Java内存模型 随着计算机的CPU的飞速发展,CPU的运算能力已经远远超出了从主内存(运行内存)中读取的数据的能力,为了解决这个问题,CPU厂商设计出了CPU内置高速缓存区.高速缓存区的加入使得CP ...

  4. Java并发编程实战笔记2:对象的组合

    设计线程安全的类 在设计现车让安全类的过程之中,需要包含以下三步: 找出构成对象状态的所有变量 找出约束状态变量的不变性条件 建立对象状态的并发访问策略 实例封闭 通过封闭机制与合适的加锁策略结合起来 ...

  5. Java并发编程75道面试题及答案

    1.在java中守护线程和本地线程区别?java中的线程分为两种:守护线程(Daemon)和用户线程(User).任何线程都可以设置为守护线程和用户线程,通过方法Thread.setDaemon(bo ...

  6. java并发实战编程pdf_「原创」Java并发编程系列25 | 交换器Exchanger

    2020年Java面试题库连载中 [000期]Java最全面试题库思维导图 [001期]JavaSE面试题(一):面向对象 [002期]JavaSE面试题(二):基本数据类型与访问修饰符 [003期] ...

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

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

  8. Java 并发编程系列之带你了解多线程

    早期的计算机不包含操作系统,它们从头到尾执行一个程序,这个程序可以访问计算机中的所有资源.在这种情况下,每次都只能运行一个程序,对于昂贵的计算机资源来说是一种严重的浪费. 操作系统出现后,计算机可以运 ...

  9. java 并发编程总结

    这边文章的主要内容是基于"java并发编程艺术"这本书,中间加入了一些自己的理解.这篇文章包括并发编程涉及到的几乎所有基础知识.主要是帮助长期从事业务逻辑开发的java程序员梳理一 ...

最新文章

  1. STARTTLS在电子邮件环境中的安全性分析
  2. day11 - 15(装饰器、生成器、迭代器、内置函数、推导式)
  3. android应用程序的组成部分
  4. 改变软件开发者的形象,增加多样性
  5. NAT 及 NAT 打洞技术
  6. Python 中的url,Base64和MD5编码解码的使用
  7. python处理ncdc气象数据并利用arcgis可视化
  8. Flask项目--预防csrf攻击原理
  9. oracle层次化查询
  10. java运行python脚本_java调用python脚本,中文变成问号
  11. java 找序列最小值_【C++编程练习】任意给定 n 个有序整数,求这 n 个有序整数序列的最大值,中位数和最小值...
  12. 看我72变:解决Entity Framework中枚举类型与tinyint的映射问题
  13. [BZOJ2850]巧克力王国
  14. linux python-3.10.4 安装
  15. 如何获取iOS应用网络权限?
  16. 终于找到可转载的摄影基础知识贴了
  17. 淘宝flexible.js源码分析
  18. java输入输出操作c盘文件拒绝访问问题
  19. win10辅助准星教程
  20. Windows故障恢复控制台使用方法

热门文章

  1. “雾霾”天里坐看云起时-【软件和信息服务】2014.01
  2. idea下,Jetty采用main方法启动web项目
  3. python 十大经典排序算法
  4. JVM-01:类的加载机制
  5. 用电脑自带画图工具加字方法
  6. 【完结】利用 Composer 完善自己的 PHP 框架(三)——Redis 缓存
  7. TortoiseSVN文件夹图标不显示
  8. JS报“Uncaught TypeError: undefined is not a function ”异常
  9. 2020-mb面试指南_2020年最佳代码面试准备平台
  10. 我是如何在尼日利亚的沃里创立Google Developers Group GDG分会的,并达到了100位成员...