Semaphore是JDK1.5之后出的一个实现同步的另一个方式。Semaphore可以维护当前访问自身的线程个数,并提供了同步机制。使用Semaphore可以控制同时访问资源的线程数。假如你有3个资源,有10个线程要使用该资源,同时只能有3个线程使用,所以其余7线程在等待,只要3个中任意一个释放资源,那么7个线程中的一个就可以使用了。

另外,7个线程等待可以使随机获取机会,也可以是按照先来后到的顺序获得机会,这取决与Semaphore的构造时传入的参数。

单个信号量的Semaphore对象可以实现互斥锁的功能,并且可以是有一个线程获得了锁,再有另一个线程去释放改锁,可以实现死锁恢复。

构造方法摘要
Semaphore(int permits)
          创建具有给定的许可数和非公平的公平设置的 Semaphore
Semaphore(int permits, boolean fair)

创建具有给定的许可数和给定的公平设置的 Semaphore

具体实现如下:

package andy.thread.test;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;/*** @author Zhang,Tianyou* @version 2014年11月9日 下午1:49:25*/public class ThreadSemaphoreTest {public static void main(String[] args) {// 定义一个缓存线程池ExecutorService threadPool = Executors.newCachedThreadPool();final int MAX_AVAILABLE = 100;// 定义信号量 等待线程使用公平原则 先来后到Semaphore semaphore = new Semaphore(MAX_AVAILABLE, true);for (int i = 0; i < 10; i++) {Runnable runnable = new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubtry {// 此信号量获取一个许可,在提供一个许可前一直将线程阻塞,否则线程被中断。semaphore.acquire();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}// availablePermits() 返回此信号量中当前可用的许可数。System.out.println("线程"+ Thread.currentThread().getName()+ "进入,当前已有"+ (MAX_AVAILABLE- semaphore.availablePermits() + "个并发"));try {Thread.sleep((long) (Math.random() * 10000));} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("线程" + Thread.currentThread().getName()+ "即将离开");// 释放一个许可,将其返回等待线程给信号量。semaphore.release();}};threadPool.execute(runnable);}}}

运行效果如下:

线程pool-1-thread-1进入,当前已有1个并发
线程pool-1-thread-3进入,当前已有2个并发
线程pool-1-thread-2进入,当前已有3个并发
线程pool-1-thread-5进入,当前已有4个并发
线程pool-1-thread-7进入,当前已有5个并发
线程pool-1-thread-4进入,当前已有6个并发
线程pool-1-thread-6进入,当前已有7个并发
线程pool-1-thread-8进入,当前已有8个并发
线程pool-1-thread-9进入,当前已有9个并发
线程pool-1-thread-10进入,当前已有10个并发
线程pool-1-thread-5即将离开
线程pool-1-thread-3即将离开
线程pool-1-thread-6即将离开
线程pool-1-thread-7即将离开
线程pool-1-thread-2即将离开
线程pool-1-thread-8即将离开
线程pool-1-thread-9即将离开
线程pool-1-thread-10即将离开
线程pool-1-thread-1即将离开
线程pool-1-thread-4即将离开

多线程之实现同步的信号量Semaphore相关推荐

  1. python 归纳 (二五)_多进程数据共享和同步_信号量Semaphore

    # -*- coding: utf-8 -*- """ 多进程同步 使用信号量 multiprocessing.Semaphore逻辑:启动5个进程,打印,每个各自睡眠2 ...

  2. windows C++多线程(七):信号量Semaphore的使用

    信号量与临界区,mutex不同,信号量在同一时刻运行多个线程访问同一资源,信号量的使用只要涉及到CreateSemaphore() .OpenSemaphore().ReleaseSemaphore( ...

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

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

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

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

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

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

  6. C#笔记20:多线程之线程同步中的信号量AutoResetEvent和ManualResetEvent

    C#笔记20:多线程之线程同步中的信号量AutoResetEvent和ManualResetEvent 本章概要: 1:终止状态和非终止状态 2:AutoResetEvent和ManualResetE ...

  7. windows 多线程 (六) 信号量Semaphore

    首先也来看看如何使用信号量,信号量Semaphore常用有三个函数,使用很方便.下面是这几个函数的原型和使用说明. 第一个 CreateSemaphore 函数功能:创建信号量 函数原型: HANDL ...

  8. python 线程等待_详解python多线程之间的同步(一)

    引言: 线程之间经常需要协同工作,通过某种技术,让一个线程访问某些数据时,其它线程不能访问这些数据,直到该线程完成对数据的操作.这些技术包括临界区(Critical Section),互斥量(Mute ...

  9. Java多线程系列(九):CountDownLatch、Semaphore等4大并发工具类详解

    之前谈过高并发编程系列:4种常用Java线程锁的特点,性能比较.使用场景 ,以及高并发编程系列:ConcurrentHashMap的实现原理(JDK1.7和JDK1.8) 今天主要介绍concurre ...

  10. 【Linux】线程同步之信号量同步

    linux中两种基本的同步方法是信号量和互斥量.这两种方法很相似,而且它们可以相互通过对方来实现. 信号量概述 下面介绍用信号量进行同步. 信号量概念由荷兰科学家Dijkstra首先提出.信号量是一个 ...

最新文章

  1. OpenCV笔记(Size)
  2. [RHEL5企业级Linux服务攻略]--第9季 Squid服务全攻略之高级配置
  3. java.util -- List接口
  4. C# 算法题系列(一) 两数之和、无重复字符的最长子串
  5. Dataphin功能:集成——如何将业务系统的数据抽取汇聚到数据中台
  6. Spring Cloud 入门 之 Feign 篇(三)
  7. ios 图片居中裁剪_IOS图片裁剪和小图看大图动画
  8. DBMS_ERRLOG记录DML错误日志(一)
  9. windows11,安装maven。
  10. EDEM2019 实例操作教程——输送带
  11. 苹果计算机开机进入安全模式,iphone进入安全模式及退出安全模式的方法
  12. 【学习路线】2022届校招C++后端服务器开发/实习,个人学习路线总结/记录
  13. ReactNative 获取地理位置信息
  14. 基于Android的人脸识别
  15. spring之AOP切面不生效!!!!!原因在这
  16. fedora8下删除antivir
  17. TUANDUIZUOYE
  18. 毕业工作五年的总结和感悟(中)
  19. BCA签约艺术家大悲宇宙NFT作品在苏富比拍卖以14万美元价格成交
  20. 第一个Android应用小程序

热门文章

  1. 李沐亚马逊资深首席科学家 - 动手学深度学习v2 -2安装
  2. 命令查询职责分离模式 CQRS Command Query Responsibility Segregation
  3. linux环境安装ffmepg,Linux centOS下安装FFmpeg
  4. git add/rm/mv文件到暂存区
  5. ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any()
  6. 随机森林评估特征重要性
  7. torch运行错误libcudnn Unsupported HDF5 version: 1.10.2错误
  8. 斯坦福大学自然语言处理第二课“文本处理基础(Basic Text Processing)”
  9. 如何生成随机数(上)
  10. 最近写mapreduce程序从hbase中抽取程序遇到的一些问题