近日于LeetCode看题遇1114 按序打印,获悉一解法使用了Semaphore,顺势研究,记心得于此。

此解视Semaphore为锁,以保证同一时刻单线程的顺序执行。在此原题上,我作出如下更改。

package test;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;public class SemaphoreDemo {static Semaphore A;static Semaphore B;static Semaphore C;public static void main(String[] args) throws InterruptedException {  A = new Semaphore(1);B = new Semaphore(0);C = new Semaphore(0);ExecutorService ex=Executors.newFixedThreadPool(10);for (int i = 0; i <7; i++) {ex.execute(new R1());ex.execute(new R2());ex.execute(new R3());}ex.shutdown();}      public static class R1 implements Runnable{@Overridepublic void run() {try {
//              A.acquire();System.out.println("1"+Thread.currentThread().getName());
//              B.release();} catch (Exception e) {e.printStackTrace();}} }public static  class R2 implements Runnable{@Overridepublic void run() {try {
//              B.acquire();System.out.println("2"+Thread.currentThread().getName());
//              C.release();} catch (Exception e) {e.printStackTrace();}} }public static  class R3 implements Runnable{@Overridepublic void run() {try {
//              C.acquire();System.out.println("3"+Thread.currentThread().getName());
//              A.release();} catch (Exception e) {e.printStackTrace();}} }}

10个线程的常量池中,分别调用R1,R2,R3的方法多次,控制台输出对应各方法名拼接执行该方法的线程名。多次执行结果各不相同:

1pool-1-thread-1
2pool-1-thread-2
1pool-1-thread-4
3pool-1-thread-6
2pool-1-thread-5
3pool-1-thread-3
1pool-1-thread-7
2pool-1-thread-8
3pool-1-thread-9
3pool-1-thread-1
2pool-1-thread-8
1pool-1-thread-4
3pool-1-thread-1
1pool-1-thread-2
2pool-1-thread-9
1pool-1-thread-10
3pool-1-thread-1
2pool-1-thread-5
1pool-1-thread-6
3pool-1-thread-4
2pool-1-thread-8
1pool-1-thread-1
2pool-1-thread-2
3pool-1-thread-3
1pool-1-thread-4
2pool-1-thread-5
3pool-1-thread-6
1pool-1-thread-7
2pool-1-thread-8
3pool-1-thread-9
1pool-1-thread-10
3pool-1-thread-1
1pool-1-thread-4
2pool-1-thread-8
3pool-1-thread-3
2pool-1-thread-10
1pool-1-thread-2
2pool-1-thread-9
3pool-1-thread-4
1pool-1-thread-7
3pool-1-thread-6
2pool-1-thread-5

方法能调用,多线程下却无法保证方法的顺序执行。使用Semaphore后,代码为:

package test;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;public class SemaphoreDemo {static Semaphore A;static Semaphore B;static Semaphore C;public static void main(String[] args) throws InterruptedException {  A = new Semaphore(1);B = new Semaphore(0);C = new Semaphore(0);ExecutorService ex=Executors.newFixedThreadPool(10);for (int i = 0; i <7; i++) {ex.execute(new R1());ex.execute(new R2());ex.execute(new R3());}ex.shutdown();}      public static class R1 implements Runnable{@Overridepublic void run() {try {A.acquire();System.out.println("1"+Thread.currentThread().getName());B.release();} catch (Exception e) {e.printStackTrace();}} }public static  class R2 implements Runnable{@Overridepublic void run() {try {B.acquire();System.out.println("2"+Thread.currentThread().getName());C.release();} catch (Exception e) {e.printStackTrace();}} }public static  class R3 implements Runnable{@Overridepublic void run() {try {C.acquire();System.out.println("3"+Thread.currentThread().getName());A.release();} catch (Exception e) {e.printStackTrace();}} }}

多次运行结果皆能保证1、2、3的顺序:

1pool-1-thread-1
2pool-1-thread-2
3pool-1-thread-3
1pool-1-thread-4
2pool-1-thread-5
3pool-1-thread-6
1pool-1-thread-7
2pool-1-thread-8
3pool-1-thread-9
1pool-1-thread-10
2pool-1-thread-1
3pool-1-thread-2
1pool-1-thread-3
2pool-1-thread-4
3pool-1-thread-5
1pool-1-thread-6
2pool-1-thread-9
3pool-1-thread-7
1pool-1-thread-10
2pool-1-thread-8
3pool-1-thread-1

附上api文档链接 Semaphore

A = new Semaphore(1);
 B = new Semaphore(0);
 C = new Semaphore(0);

进入R2、R3方法的线程会执行acquire()方法,而B、C中的计数器为0获取不到许可,阻塞直到一个可用,或者线程被中断,不能继续执行。R1方法中A尚有1个许可可拿到,方法执行,并给B发布一个许可,若B先于A执行acquire(),此时B为阻塞状态,则获取到刚刚发布的许可,该线程被重新启用。

信号量Semaphore相关推荐

  1. 秒杀多线程第八篇 经典线程同步 信号量Semaphore

    阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event& ...

  2. Python 线程信号量 semaphore - Python零基础入门教程

    目录 一.Python 线程信号量 semaphore 简介 二.Python 线程信号量 semaphore 原理 三.Python 线程信号量 semaphore 函数介绍 四.Python 线程 ...

  3. java semaphorewa_Java并发(十五):并发工具类——信号量Semaphore

    先做总结: 1.Semaphore是什么? Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源. 把它比作是控制流量的红绿灯,比如XX马路要 ...

  4. 信号量semaphore 读写锁ReadWriteLock 倒计时器CountDownLatch 循环栅栏 CyclicBarrier 线程阻塞工具类LockSupport...

    信号量semaphore    允许多个线程同时访问 读写锁ReadWriteLock   在频繁的读写耗时中,读之间不阻塞 倒计时器CountDownLatch    obj = new Count ...

  5. java 信号量Semaphore

    在很多情况下,可能有多个线程需要访问数目很少的资源.假想在服务器上运行着若干个回答客户端请求的线程.这些线程需要连接到同一数据库,但任一时刻 只能获得一定数目的数据库连接.你要怎样才能够有效地将这些固 ...

  6. 经典线程同步 信号量Semaphore

    信号量Semaphore常用有三个函数,使用很方便.下面是这几个函数的原型和使用说明. 第一个 CreateSemaphore 函数功能:创建信号量 函数原型: HANDLE CreateSemaph ...

  7. .Net 下信号量(Semaphore)的一种实现

    动机 从开始接触多线(进)程编程模型开始,学习的就是和信号量(Semaphore)相关的同步原语.不知道为什么 .Net Framework 里却没有相应的东东.要命的是, 我以前有很多久经考验的C+ ...

  8. python 信号量 semaphore

    信号量 信号量(英语:semaphore)又称为信号标, 是一个同步对象,用于保持在0至指定最大值之间的一个计数值. 当线程完成一次对该semaphore对象的等待(wait)时,该计数值减一: 当线 ...

  9. java多线程的同步控制_Java多线程并发控制工具信号量Semaphore,实现原理及案例...

    信号量(Semaphore)是Java多线程兵法中的一种JDK内置同步器,通过它可以实现多线程对公共资源的并发访问控制.一个线程在进入公共资源时需要先获取一个许可,如果获取不到许可则要等待其它线程释放 ...

  10. 信号量(Semaphore)、闭锁(Latch)、栅栏(Barrier)

    目录 1.信号量(Semaphore) 描述 场景 Semaphore 2.闭锁(Latch) 描述 场景 CountDownLatch 3.栅栏(Barrier) 描述 场景 CyclicBarri ...

最新文章

  1. SpringMVC - 非注解的处理器映射器和适配器
  2. FPGA篇(一) 基于verilog的定点开方运算(1)-逐次逼近算法
  3. 【技术综述】深度学习中的数据增强(下)
  4. Linux运维之——每日小技巧,使用awk命令截取每行的指定列数据
  5. MYSQL,Oracle,SQL数据库在JSP中的驱动
  6. 仅此一文让你明白事务隔离级别、脏读、不可重复读、幻读
  7. 3.3亿人都在用小程序,中国首次定义的互联网标准又有新进展
  8. Nginx下root指令问题
  9. ReentrantReadWriteLock源码解读
  10. (译)如何使用spritehelper和levelhelper教程:引子
  11. 人工智能的语义学基础
  12. 微图影像地图导出拼接大图的参数说明
  13. 理财项目中宏涌晟五个投资理财基础知识
  14. excel系列【统计一列中的不重复项】
  15. 简洁、快速、节约内存的Excel处理工具EasyExcel
  16. 使用c语言判断是闰年还是平年
  17. 使用Python和YOLO检测车牌
  18. 《计算机组成原理》大题必考!
  19. OTM区块链应用离我们的生活有多近?
  20. 浙政钉(专有钉钉)门户免登(超详细)

热门文章

  1. 支持BLE 5.1 AoA/AoD,EFR32BG22参数对比nRF52833和nRF52811
  2. Spark RDD 论文详解(五)实现
  3. 数据中心的节能减排之路
  4. 步入AIGC时代,展望人工智能发展
  5. 如何让搜索引擎搜索到自己博客文章
  6. 使用宝利通视频会议时声音断断续续的怎么处理
  7. 多目标优化算法:多目标天鹰优化算法MOAO(提供Matlab代码)
  8. 小波分析:三、二维离散小波变换
  9. 手机背光检测设备,三菱5U程序案例,4轴伺服控制,串口通讯,成熟项目案例
  10. 放狗屁、狗放屁和放屁狗