Semaphore使用

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

释放访问许可。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

public class TestSemaphore {

	public static void main(String[] args) throws InterruptedException {
		// 线程池
		ExecutorService exec = Executors.newCachedThreadPool();
		// 只能5个线程同时访问
		final Semaphore semp = new Semaphore(5);
		// 模拟20个客户端访问
		for (int index = 0; index < 20; index++) {
			final int NO = index;
			Runnable run = new Runnable() {
				public void run() {
					try {
						// 获取许可
						semp.acquire();
						System.out.println("Accessing: " + NO);
						// 访问完后,释放
						semp.release();
						System.out.println("-----------------"
								+ semp.availablePermits());
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			};
			exec.execute(run);
		}
		// 退出线程池
		exec.shutdown();
	}
}


Semaphore的使用及其方法的使用

  • 2014年12月18日 22:20
  • 5KB
  • 下载

Java的Semaphore使用总结

前言: 信号量是用来对某一共享资源所能访问的最大个数进行控制 代码示例一: package com.example; import java.util.concurrent.Semaphore...

使用Lock,wait/notify,Semaphore三种方式实现多线程通信

java的多线程通信有Lock,wait/notify,Semaphore三种方式,已一道常见面试题来简单演示这三种多线程通信方式。 两个线程循环间隔打印指定内容,一个打印从1到52的数字,一个打印从...

Semaphore信号量使用

Java 信号量 Semaphore 介绍

Semaphore的使用之-多生产者-多消费者模式

本实验的目的不光是要实现生产者与消费者模式,还要限制生产者与消费者的数量,这样代码的复杂性就提高一些,但好在使用Semaphore类实现这个功能还是比较简单的。 创建实验用的项目repastTest,...

Semaphore的使用

Semaphore也是一个线程同步的辅助类,可以维护当前访问自身的线程个数,并提供了同步机制。使用Semaphore可以控制同时访问资源的线程个数,例如,实现一个文件允许的并发访问数。...

java并发编程系列之Semaphore信号量的使用

信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。一个计数信号量,从概念上讲,信号量维护了一个许可集。如有...

Linux 设备驱动--- 并发 之- 信号量 --- semaphore --- down_interruptible --- 按键信号量使用

信号量:           Linux 内核的信号量在概念和原理上与用户态的信号量是一样的,           但是它不能在内核之外使用,只能在内核中,它是一种睡眠锁.           ...

【Java并发编程】01.Semaphore的使用

今天开始准备学习Java并发编程。准备把这个系列写到一个专栏里面,记录一下我学习Java并发编程的过程。希望和大家共同进步。所有代码我会上传到GitHub上面,地址是:https://github.c...
  • mrbcy
  • mrbcy
  • 2017年02月19日 01:20
  • 155
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Semaphore使用
举报原因:
原因补充:

(最多只允许输入30个字)