【0】README

0.1)以下内容转自网络,旨在理清 “java线程——信号量(Semaphore)+障栅(CyclicBarrier)”的相关知识


【1】信号量

1.1)信号量定义:从概念上讲,一个信号量管理许多的许可证。为了通过信号量,线程通过调用 acquire 请求许可;
1.2)其实没有实际的许可对象, 信号量仅仅是维护了一个计数;
1.3)看个荔枝:转自 http://www.cnblogs.com/whgw/archive/2011/09/29/2195555.html

  • 1.3.1) Semaphore当前在多线程环境下被扩放使用,操作系统的信号量是个很重要的概念,在进程控制方面都有应用。Java 并发库 的Semaphore 可以很轻松完成信号量控制,Semaphore可以控制某个资源可被同时访问的个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。比如在Windows下可以设置共享文件的最大客户端访问个数。
  • 1.3.2)荔枝说明: Semaphore实现的功能就类似厕所有5个坑,假如有10个人要上厕所,那么同时只能有多少个人去上厕所呢? 同时只能有5个人能够占用,当5个人中 的任何一个人让开后,其中等待的另外5个人中又有一个人可以占用了。另外等待的5个人中可以是随机获得优先机会,也可以是按照先来后到的顺序获得机会,这取决于构造Semaphore对象时传入的参数选项。单个信号量的Semaphore对象可以实现互斥锁的功能,并且可以是由一个线程获得了“锁”,再由另一个线程释放“锁”,这可应用于死锁恢复的一些场合。
  • 1.3.3)Semaphore维护了当前访问的个数,提供同步机制,控制同时访问的个数。 在数据结构中链表可以保存“无限”的节点,用Semaphore可以实现有限大小的链表。另外重入锁 ReentrantLock 也可以实现该功能,但实现上要复杂些。

1.4)下面的Demo中申明了一个只有5个许可的Semaphore,而有10个线程要访问这个资源,通过acquire()和release()获取和释放访问许可。

  • for full source code, please visit : https://github.com/pacosonTang/core-java-volume/blob/master/chapter14/SemaphoreTest.java

  • source code at a glance :

package com.corejava.chapter14_6;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
import static java.lang.System.*;public class SemaphoreTest
{public static void main(String[] args){// thread poolExecutorService exec = Executors.newCachedThreadPool();// there must be 5 threads accessing certain sourcefinal Semaphore semaphore = new Semaphore(5);for (int i = 0; i < 10; i++){final int num = i;Runnable run = new Runnable() // create 10 threads circularly{@Overridepublic void run(){try{semaphore.acquire();// acquire permissionout.println("accessing " + num);Thread.sleep((long)(Math.random()*10000));semaphore.release(); // release permissionout.println("semaphore.availablePermits = " + semaphore.availablePermits());}catch(InterruptedException e){e.printStackTrace();}}};exec.execute(run);// thread's startup}exec.shutdown(); // shutdown all of threads}
}

【2】障栅

2.1)定义: CyclicBarrier 类实现了一个集结点 称为障栅;

  • 2.1.1)障栅的作用:考虑大量线程运行在一次计算的不同部分的情形: 当所有部分都准备好时, 需要吧结果组合到一起, 当一个线程完成了它的那部分任务后, 我们让它运行到障栅处。 一旦所有的线程都到达了这个 障栅, 障栅就撤销了, 线程就可以继续运行了了;

  • step1)构造一个障栅,并给出参与的线程数:

CyclicBarrier cyclicBarrier = new CyclicBarrier(2, new Runnable()
  • step2) 每个线程做一些工作, 完成后再障栅上调用 await()方法
public void run(){arr[id] = new Random().nextInt(100);try{out.println(id + " starts to have a rest!");cyclicBarrier.await();out.println(id + "wake up!");} catch (Exception e){e.printStackTrace();}
  • step3) 如果任何一个在 障栅上等待的线程离开了障栅, 那么障栅就被破坏了;
  • step4)可以提供一个可选的 障栅 动作(Barrier Action), 当所有线程到达障栅的时候就会执行这个工作:
Runnable barrierAction = ...
CyclicBarrier cyclicBarrier = new CyclicBarrier(nthreds, barrienAction)
CyclicBarrier cyclicBarrier = new CyclicBarrier(2, new Runnable()
  • step5) 障栅被称为是循环的, 因为可以在所有等待线程被释放后被重用。 在这一点上, 有别于 CountDownLatch, CountDownLatch 只能被使用一次;

2.2)看个荔枝: 转自 http://my.oschina.net/summerpxy/blog/189799

  • 2.2.1)CyclicBarrier称为障栅,这个类有什么作用呢? 这个类是用来同步线程用的。以小黑车为例(就是盘踞在地铁口的黑出租),一般小黑车是坐4个人,只有4个人都满了之后小黑车才会走,那么如果你是第一个来的,进车坐下,等第二个人来。第二个人来了,等第三个人,如此直到所有的4个人满了之后小黑车才开车。那么这个类也是一样的。

    • 第一个线程:运行到障栅出,等待第二个线程到达。
    • 第二个线程:运行到障栅出,等待第三个线程到达。
    • 第三个线程:运行到障栅出,等待第四个线程到达。
    • 第四个线程:运行到障栅出,障栅解除,所有线程都开始执行。
  • 2.2.2)荔枝代码:下面是一个demo,arr[0]和arr[1]的赋值是两个线程完成的,当两个线程的赋值结束之后才会得到arr[2]的值:
    • for full source code , please visit https://github.com/pacosonTang/core-java-volume/blob/master/chapter14/CyclicBarrierTest.java

  • source code at a glance :
package com.corejava.chapter14_6;import java.util.Random;
import java.util.concurrent.CyclicBarrier;
import static java.lang.System.*;public class CyclicBarrierTest
{public static void main(String[] args){int[] arr = new int[3];//可以提供一个可选的 障栅 动作(Barrier Action), 当所有线程到达障栅的时候就会执行这个工作//CyclicBarrier cyclicBarrier = new CyclicBarrier(nthreds, barrienAction)CyclicBarrier cyclicBarrier = new CyclicBarrier(2, new Runnable(){@Overridepublic void run(){arr[2] = arr[0] + arr[1];for (int i = 0; i < arr.length; i++)out.println("arr[" + i +"] = " + arr[i]);}});new Thread(new MyCyclicBarrier(1, arr, cyclicBarrier)).start();new Thread(new MyCyclicBarrier(0, arr, cyclicBarrier)).start();}
}class MyCyclicBarrier implements Runnable
{int id;int[] arr;CyclicBarrier cyclicBarrier;public MyCyclicBarrier(int id, int[] arr, CyclicBarrier barrier){this.id = id;this.arr = arr;this.cyclicBarrier = barrier;}@Overridepublic void run(){arr[id] = new Random().nextInt(100);try{out.println(id + " starts to have a rest!");cyclicBarrier.await();out.println(id + " wake up!");} catch (Exception e){e.printStackTrace();}}}

java线程——信号量(Semaphore)+障栅(CyclicBarrier)相关推荐

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

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

  2. JAVA多线程信号量Semaphore

    1.Semaphore 是什么 Semaphore 通常我们叫它信号量, 可以用来控制同时访问特定资源的线程数量,通过协调各个线程,以保证合理的使用资源. 可以把它简单的理解成我们停车场入口立着的那个 ...

  3. Java 线程同步组件 CountDownLatch 与 CyclicBarrier 原理分析

    1.简介 在分析完AbstractQueuedSynchronizer(以下简称 AQS)和ReentrantLock的原理后,本文将分析 java.util.concurrent 包下的两个线程同步 ...

  4. java count 在哪一类里_java 5线程中 Semaphore信号灯,CyclicBarrier类,CountDownLatch计数器以及Exchanger类使用...

    先来讲解一下Semaphore信号灯的作用: 可以维护当前访问自身的线程个数,并提供了同步机制, 使用semaphore可以控制同时访问资源的线程个数 例如,实现一个文件允许的并发访问数. 请看下面的 ...

  5. python线程信号量semaphore

    一.semaphore信号量原理 多线程同时运行,能提高程序的运行效率,但是并非线程越多越好,而semaphore信号量可以通过内置计数器来控制同时运行线程的数量,启动线程(消耗信号量)内置计数器会自 ...

  6. java线程栅栏_Java 多线程基础 - CyclicBarrier

    我的博客 转载请注明原创出处. 序 java.util.concurrent包里有几个能帮助人们管理相互合作的线程集的类,为多线程常见的应用场景预置了抽象好的类库.在遇到这些应用场景时应该直接重用合适 ...

  7. java 信号量Semaphore

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

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

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

  9. Java并发编程之CountDownLatch、CyclicBarrier和Semaphore

    前言 本文为对CountDownLatch.CyclicBarrier.Semaphore的整理使用 CountDownLatch CountDownLatch类位于java.util.concurr ...

最新文章

  1. 决赛评审招募 | 学生创意能有多不羁?快来网易看决赛!
  2. UIView使用UIMotionEffect效果
  3. php tp 支付宝 支付,php实现的支付宝网页支付功能示例【基于TP5框架】
  4. linux系统常见操作,Linux系统基本操作
  5. Spark源码分析之BlockManager通信机制
  6. 【代码笔记】Web-JavaScript-JavaScript 运算符
  7. unity多人联机插件_Unity网络系统插件,打通游戏联网任督二脉
  8. 【Git】<分布式版本控制系统>版本控制器Git概述
  9. 《炬丰科技-半导体工艺》用于高效显示和通信的无磷白光 LED
  10. Dragonfly单机部署比redis快25倍的缓存中间件
  11. xss.haozi.me解题记录
  12. Aria2 下载工具(转)
  13. 淀粉肽Amyloid β-Protein (1-24)、Aβ1-24|138648-77-8|DAEFRHDSGYEVHHQKLVFFAEDV
  14. 书香云集Pc版书籍导出
  15. 我为何一直强调外包公司别去
  16. 第10章第27节:使用Psychedelic waves生成梦幻般的波纹图像 [PowerPoint精美幻灯片实战教程]
  17. 便携式计算机的基本知识,使用便携式计算机,错误的做法是()A、非涉密便携机不得存储或处理涉密信息B、涉密便携机需经过保 - 普法考试题库问答...
  18. 按键精灵入门指引——应用导向学习
  19. vue脚手架-上传图片 编辑修改图片(三)
  20. (Halcon应用系列)Halcon+C#联合编程

热门文章

  1. 牛客题霸 [ 岛屿数量] C++题解/答案
  2. 一二三系列之优先队列、st表——Battle,Heapsort,A Magic Lamp
  3. 二分:路标设置(洛谷)
  4. CF1511G-Chips on a Board【倍增】
  5. YbtOJ#791-子集最值【三维偏序】
  6. P5516-[MtOI2019]小铃的烦恼【期望dp,线性消元】
  7. jzoj3410-[GDOI2014模拟]Tree【最小生成树,贪心】
  8. P3951,jzoj5473-小凯的疑惑【数论】(NOIP2017提高组)
  9. ssl1760-商店选址问题【图论,最短路】
  10. 牛客练习赛 56 E tarjan 割边