Java并发之Semaphore的使用
Java并发之Semaphore的使用
一.简介
今天突然发现,看着自己喜欢的球队发挥如此的棒,然后写着博客,这种感觉很爽。现在是半场时间,就趁着这个时间的空隙,说说Java并发包中另外一个重量级的类Semaphore,这个类从字面意义上理解是"信号量"。
那么什么是信号量呢?我用一种比较通俗的方式来跟大家解释一下,就是在该类初始化的时候,给定一个数字A,每个线程调用acquire()方法后,首先判断A是否大于0,如果大于0,就将A减去1,然后执行对应的线程,如果不大于0,那么就会阻塞,直到其他线程调用了release()方法,将A加上1,该线程可能有执行的机会。请各位读者原谅笔者用这种粗俗的方式去解释这个问题,而并非其他博文所用的专业性很强的"许可"之类的词语,我认为专业的东西是给专业的人看的,很很多人想要去学习一个他根本就从未涉足的东西,那么我们就不能用专业的术语去描述,如果他能够理解所谓的专业术语,那么他还有学习的必要吗?
二. Semaphore的使用
场景介绍:有一个停车场只有5个车位,现在有100辆车要去抢这个5个车位,理想情况下最多只有五辆车同时可以抢到车位,那么没有抢到车位的车只能等到,其他的车让出车位,才有机会去使用该车位。
public class CarPark {
public static void main(String[] args) {
//阻塞队列
BlockingQueue<String> parks = new LinkedBlockingQueue<>(5);
parks.offer("车位一");
parks.offer("车位二");
parks.offer("车位三");
parks.offer("车位四");
parks.offer("车位五");
ExecutorService executorService = Executors.newCachedThreadPool();
//如博文中所说的初始值为5, 专业的说法就是5个许可证
Semaphore semaphore = new Semaphore(5);
for (int i = 0; i < 100; i++) {
final int no = i;
Thread t1 = new Thread(() -> {
try {
/**
* 获取许可,首先判断semaphore内部的数字是否大于0,如果大于0,
* 才能获得许可,然后将初始值5减去1,线程才会接着去执行;如果没有
* 获得许可(原因是因为已经有5个线程获得到许可,semaphore内部的数字为0),
* 线程会阻塞直到已经获得到许可的线程,调用release()方法,释放掉许可,
* 也就是将semaphore内部的数字加1,该线程才有可能获得许可。
*/
semaphore.acquire();
/**
* 对应的线程会到阻塞对,对应车辆去获取到车位,如果没有拿到一致阻塞,
* 直到其他车辆归还车位。
*/
String park = parks.take();
System.out.println("车辆【" + no + "】获取到: " + park);
Thread.sleep((long) Math.random() * 6000);
semaphore.release(); //线程释放掉许可,通俗来将就是将semaphore内部的数字加1
parks.offer(park); //归还车位
System.out.println("车辆【" + no + "】离开 " + park);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
executorService.execute(t1);
}
}
}
Java并发之Semaphore的使用的更多相关文章
- Java并发之Semaphore和Exchanger工具类简单介绍
一.Semaphore介绍 Semaphore意思为信号量,是用来控制同时访问特定资源的线程数数量.它的本质上其实也是一个共享锁.Semaphore可以用于做流量控制,特别是公用资源有限的应用场景.例 ...
- Java并发之Semaphore源码解析(二)
在上一章,我们学习了信号量(Semaphore)是如何请求许可证的,下面我们来看看要如何归还许可证. 可以看到当我们要归还许可证时,不论是调用release()或是release(int permit ...
- Java并发之Semaphore源码解析(一)
Semaphore 前情提要:在学习本章前,需要先了解笔者先前讲解过的ReentrantLock源码解析,ReentrantLock源码解析里介绍的方法有很多是本章的铺垫.下面,我们进入本章正题Sem ...
- java并发之Semaphore
一.定义 一个计数信号量.从概念上讲,信号量维护了一个许可集.如有必要,在许可可用前会阻塞每一个acquire(),然后再获取该许可.每个release() 添加一个许可,从而可能释放一个正在阻塞的获 ...
- java并发之(4):Semaphore信号量、CounDownLatch计数锁存器和CyclicBarrier循环栅栏
简介 java.util.concurrent包是Java 5的一个重大改进,java.util.concurrent包提供了多种线程间同步和通信的机制,比如Executors, Queues, Ti ...
- 深入理解Java并发之synchronized实现原理
深入理解Java类型信息(Class对象)与反射机制 深入理解Java枚举类型(enum) 深入理解Java注解类型(@Annotation) 深入理解Java类加载器(ClassLoader) 深入 ...
- 高并发之Semaphore、Exchanger、LockSupport
本系列研究总结高并发下的几种同步锁的使用以及之间的区别,分别是:ReentrantLock.CountDownLatch.CyclicBarrier.Phaser.ReadWriteLock.Stam ...
- Java并发之AQS原理解读(一)
前言 本文简要介绍AQS以及其中两个重要概念:state和Node. AQS 抽象队列同步器AQS是java.util.concurrent.locks包下比较核心的类之一,包括AbstractQue ...
- java多线程--信号量Semaphore的使用
Semaphore可以控制某个共享资源可被同时访问的次数,即可以维护当前访问某一共享资源的线程个数,并提供了同步机制.例如控制某一个文件允许的并发访问的数量. 例如网吧里有100台机器,那么最多只能提 ...
随机推荐
- Linux基础命令(2)
Fskey servername scp命令 grep 命令 find 命令 echo 命令 xargs 命令 file 命令 cat 命令 /dev/null tar 打包 gzip 压缩 示例 ...
- C++ STL标准模板库(vector)
//vector的使用 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<vector> using na ...
- 请写出一段表单提交的HTML代码,表单名称为form1,提交方式为post,提交地址为submit.asp
请写出一段表单提交的HTML代码,表单名称为form1,提交方式为post,提交地址为submit.asp 解答: <form name=”form1” method=”post” action ...
- AWT从概念产生到完成实现只用了一个月
这种糟糕的设计选择使得那些拥护Java“一次编写,到处运行 (write once, run anywhere)”信条的程序员们过得并不舒畅,因为AWT并不能保证他们的应用在各种平台上表现得有多相似. ...
- hdu 5360 Hiking(优先队列+贪心)
题目:http://acm.hdu.edu.cn/showproblem.php? pid=5360 题意:beta有n个朋友,beta要邀请他的朋友go hiking,已知每一个朋友的理想人数[L, ...
- jquery添加!important样式
$("span.colorFlag").parents("th").css("cssText","background-color ...
- 【PyQt】分析承载界面
承载界面: # coding=utf-8 import sys from PyQt4.QtCore import * from PyQt4.QtGui import * import class_da ...
- Asp.net控制Tomcat启动关闭的实现方法
一.场景 近日有个项目客户要求能自己配置相关权限.由于历史原因这个项目采用的是公司以前的权限系统.这个权限系统很强大,不过有个弊端,就是每增加一个权限菜单都要重启才能生效,不然就要等1天它缓存过期后才 ...
- 边缘检测算子和小波变换提取图像边缘【matlab】
Roberts边缘检测算子:根据一对互相垂直方向上的差分可用来计算梯度的原理,采用对角线方向相邻两像素之差. 小波变换的方法比较适用于展现夹带在正常信号中的瞬间反常现象,具有方向敏感性.所以可以边缘检 ...
- Linux经常使用命令(十八) - find概述
Linux下find命令在文件夹结构中搜索文件,并运行指定的操作.Linux下find命令提供了相当多的查找条件,功能非常强大.由于find具有强大的功能,所以它的选项也非常多.当中大部分选项都值得我 ...