多线程之实现同步的信号量Semaphore
Semaphore是JDK1.5之后出的一个实现同步的另一个方式。Semaphore可以维护当前访问自身的线程个数,并提供了同步机制。使用Semaphore可以控制同时访问资源的线程数。假如你有3个资源,有10个线程要使用该资源,同时只能有3个线程使用,所以其余7线程在等待,只要3个中任意一个释放资源,那么7个线程中的一个就可以使用了。
另外,7个线程等待可以使随机获取机会,也可以是按照先来后到的顺序获得机会,这取决与Semaphore的构造时传入的参数。
单个信号量的Semaphore对象可以实现互斥锁的功能,并且可以是有一个线程获得了锁,再有另一个线程去释放改锁,可以实现死锁恢复。
构造方法摘要 | |
---|---|
Semaphore(int permits) 创建具有给定的许可数和非公平的公平设置的 Semaphore 。
|
|
Semaphore(int permits, boolean fair)
创建具有给定的许可数和给定的公平设置的 |
具体实现如下:
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相关推荐
- python 归纳 (二五)_多进程数据共享和同步_信号量Semaphore
# -*- coding: utf-8 -*- """ 多进程同步 使用信号量 multiprocessing.Semaphore逻辑:启动5个进程,打印,每个各自睡眠2 ...
- windows C++多线程(七):信号量Semaphore的使用
信号量与临界区,mutex不同,信号量在同一时刻运行多个线程访问同一资源,信号量的使用只要涉及到CreateSemaphore() .OpenSemaphore().ReleaseSemaphore( ...
- 秒杀多线程第八篇 经典线程同步 信号量Semaphore
阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event& ...
- 经典线程同步 信号量Semaphore
信号量Semaphore常用有三个函数,使用很方便.下面是这几个函数的原型和使用说明. 第一个 CreateSemaphore 函数功能:创建信号量 函数原型: HANDLE CreateSemaph ...
- java多线程的同步控制_Java多线程并发控制工具信号量Semaphore,实现原理及案例...
信号量(Semaphore)是Java多线程兵法中的一种JDK内置同步器,通过它可以实现多线程对公共资源的并发访问控制.一个线程在进入公共资源时需要先获取一个许可,如果获取不到许可则要等待其它线程释放 ...
- C#笔记20:多线程之线程同步中的信号量AutoResetEvent和ManualResetEvent
C#笔记20:多线程之线程同步中的信号量AutoResetEvent和ManualResetEvent 本章概要: 1:终止状态和非终止状态 2:AutoResetEvent和ManualResetE ...
- windows 多线程 (六) 信号量Semaphore
首先也来看看如何使用信号量,信号量Semaphore常用有三个函数,使用很方便.下面是这几个函数的原型和使用说明. 第一个 CreateSemaphore 函数功能:创建信号量 函数原型: HANDL ...
- python 线程等待_详解python多线程之间的同步(一)
引言: 线程之间经常需要协同工作,通过某种技术,让一个线程访问某些数据时,其它线程不能访问这些数据,直到该线程完成对数据的操作.这些技术包括临界区(Critical Section),互斥量(Mute ...
- Java多线程系列(九):CountDownLatch、Semaphore等4大并发工具类详解
之前谈过高并发编程系列:4种常用Java线程锁的特点,性能比较.使用场景 ,以及高并发编程系列:ConcurrentHashMap的实现原理(JDK1.7和JDK1.8) 今天主要介绍concurre ...
- 【Linux】线程同步之信号量同步
linux中两种基本的同步方法是信号量和互斥量.这两种方法很相似,而且它们可以相互通过对方来实现. 信号量概述 下面介绍用信号量进行同步. 信号量概念由荷兰科学家Dijkstra首先提出.信号量是一个 ...
最新文章
- OpenCV笔记(Size)
- [RHEL5企业级Linux服务攻略]--第9季 Squid服务全攻略之高级配置
- java.util -- List接口
- C# 算法题系列(一) 两数之和、无重复字符的最长子串
- Dataphin功能:集成——如何将业务系统的数据抽取汇聚到数据中台
- Spring Cloud 入门 之 Feign 篇(三)
- ios 图片居中裁剪_IOS图片裁剪和小图看大图动画
- DBMS_ERRLOG记录DML错误日志(一)
- windows11,安装maven。
- EDEM2019 实例操作教程——输送带
- 苹果计算机开机进入安全模式,iphone进入安全模式及退出安全模式的方法
- 【学习路线】2022届校招C++后端服务器开发/实习,个人学习路线总结/记录
- ReactNative 获取地理位置信息
- 基于Android的人脸识别
- spring之AOP切面不生效!!!!!原因在这
- fedora8下删除antivir
- TUANDUIZUOYE
- 毕业工作五年的总结和感悟(中)
- BCA签约艺术家大悲宇宙NFT作品在苏富比拍卖以14万美元价格成交
- 第一个Android应用小程序
热门文章
- 李沐亚马逊资深首席科学家 - 动手学深度学习v2 -2安装
- 命令查询职责分离模式 CQRS Command Query Responsibility Segregation
- linux环境安装ffmepg,Linux centOS下安装FFmpeg
- git add/rm/mv文件到暂存区
- ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any()
- 随机森林评估特征重要性
- torch运行错误libcudnn Unsupported HDF5 version: 1.10.2错误
- 斯坦福大学自然语言处理第二课“文本处理基础(Basic Text Processing)”
- 如何生成随机数(上)
- 最近写mapreduce程序从hbase中抽取程序遇到的一些问题