Semaphore的使用

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

Semaphore的主要方法摘要:

  void acquire()**:**从此信号量获取一个许可,在提供一个许可前一直将线程阻塞,否则线程被中断。

  void release():释放一个许可,将其返回给信号量。

  int availablePermits():返回此信号量中当前可用的许可数。

  boolean hasQueuedThreads():查询是否有线程正在等待获取。

下面是一个例子:

 1 package com.thread;
 2
 3 import java.util.concurrent.ExecutorService;
 4 import java.util.concurrent.Executors;
 5 import java.util.concurrent.Semaphore;
 6
 7 public class SemaphoreTest {
 8     public static void main(String[] args) {
 9         ExecutorService service = Executors.newCachedThreadPool();
10         final  Semaphore sp = new Semaphore(3);//创建Semaphore信号量,初始化许可大小为3
11         for(int i=0;i<10;i++){
12             try {
13                 Thread.sleep(100);
14             } catch (InterruptedException e2) {
15                 e2.printStackTrace();
16             }
17             Runnable runnable = new Runnable(){
18                     public void run(){
19                     try {
20                         sp.acquire();//请求获得许可,如果有可获得的许可则继续往下执行,许可数减1。否则进入阻塞状态
21                     } catch (InterruptedException e1) {
22                         e1.printStackTrace();
23                     }
24                     System.out.println(“线程” + Thread.currentThread().getName() +
25                             “进入,当前已有” + (3-sp.availablePermits()) + “个并发”);
26                     try {
27                         Thread.sleep((long)(Math.random()*10000));
28                     } catch (InterruptedException e) {
29                         e.printStackTrace();
30                     }
31                     System.out.println(“线程” + Thread.currentThread().getName() +
32                             “即将离开”);
33                     sp.release();//释放许可,许可数加1
34                     //下面代码有时候执行不准确,因为其没有和上面的代码合成原子单元
35                     System.out.println(“线程” + Thread.currentThread().getName() +
36                             “已离开,当前已有” + (3-sp.availablePermits()) + “个并发”);
37                 }
38             };
39             service.execute(runnable);
40         }
41     }
42
43 }

  单个信号量的Semaphore对象可以实现互斥锁的功能,并且可以是由一个线程获得了“锁”,再由另一个线程释放“锁”,这可应用于死锁恢复的一些场合。

 1 package com.thread;
 2 import java.util.concurrent.ExecutorService;
 3 import java.util.concurrent.Executors;
 4 import java.util.concurrent.Semaphore;
 5 import java.util.concurrent.locks.Lock;
 6 import java.util.concurrent.locks.ReentrantLock;
 7
 8 public class LockTest {
 9     public static void main(String[] args) {
10         final Business business = new Business();
11         ExecutorService executor =  Executors.newFixedThreadPool(3);
12         for(int i=0;i<3;i++)
13         {
14             executor.execute(
15                     new Runnable()
16                     {
17                         public void run()
18                         {
19                             business.service();
20                         }
21                     }
22
23             );
24         }
25         executor.shutdown();
26     }
27
28     private static class Business
29     {
30         private int count;
31         Lock lock = new ReentrantLock();
32         Semaphore sp = new Semaphore(1);
33         public void service()
34         {
35             //lock.lock();
36             try {
37                 sp.acquire(); //当前线程使用count变量的时候将其锁住,不允许其他线程访问
38             } catch (InterruptedException e1) {
39                 e1.printStackTrace();
40             }
41             try {
42                 count++;
43                 try {
44                     Thread.sleep(1000);
45                 } catch (InterruptedException e) {
46                     e.printStackTrace();
47                 }
48                 System.out.println(count);
49             } catch (RuntimeException e) {
50                 e.printStackTrace();
51             }
52             finally
53             {
54                 //lock.unlock();
55                 sp.release();  //释放锁
56             }
57         }
58     }
59
60 }
时间: 2024-12-23 13:57:13

Semaphore的使用的相关文章

并发工具类(三)控制并发线程数的Semaphore

简介 Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源.很多年以来,我都觉得从字面上很难理解Semaphore所表达的含义,只能把它比作是控制流量的红绿灯,比如XX马路要限制流量,只允许同时有一百辆车在这条路上行使,其他的都必须在路口等待,所以前一百辆车会看到绿灯,可以开进这条马路,后面的车会看到红灯,不能驶入XX马路,但是如果前一百辆中有五辆车已经离开了XX马路,那么后面就允许有5辆车驶入马路,这个例子里说的车就是线程,驶入马路就表

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

动机     从开始接触多线(进)程编程模型开始,学习的就是和信号量(Semaphore)相关的同步原语.不知道为什么 .Net Framework 里却没有相应的东东.要命的是, 我以前有很多久经考验的C++代码都是用她来实现的, 为了不使革命先烈的药白吃, 血白流, 只好自己生一个了. 什么是信号量(Semaphore)     如果你已经了解信号量(Semaphore)的概念了,请跳过这一段.        信号量(Semaphore)是在多线程环境下使用的一种设施, 它负责协调各个线程,

Windows 8 Store Apps学习(47) 多线程之线程同步: Semaphore等

多线程之线程同步: Semaphore, CountdownEvent, Barrier, ManualResetEvent, AutoResetEvent 介绍 重新想象 Windows 8 Store Apps 之 线程同步 Semaphore - 信号量 CountdownEvent - 通过信号数量实现线程同步 Barrier - 屏障 ManualResetEvent - 手动红绿灯 AutoResetEvent - 自动红绿灯 示例 1.演示 Semaphore 的使用 Thread

如何使用System V Semaphores API实现POSIX Semaphore API

概述 在将代码移植到 z/OS 平台时,您会面临的一个重要挑战是 POSIX semaphore API 在 z/OS 上的可用性. 通常,在 Linux/UNIX/Windows 平台上运行的很多程序都是用 POSIX semaphore 开发的. 这个问题的一个解决方案 是使用 System V API 代替 POSIX API 来实现 z/OS.这会涉及到整个代码中大量的代码更改,以及大量的编写和测试工作 .另一个更好的解决方案是使用可用的 System V API 在 z/OS 中实现

C#使用semaphore来管理异步下载请求的方法

  本文实例讲述了C#使用semaphore来管理异步下载请求的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 var semaphor = new Semaphore(50, 50); // We allow at most 50 threads for crawling var resultPins = new List<Pin>(); // Res

Semaphore维护当前访问自身的线程个数

可以实现流量控制,同时访问文件的用户数 import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; public class SemaphoreTest {     public static void main(String[] args) {         ExecutorService service =

Java并发编程:CountDownLatch、CyclicBarrier和Semaphore

在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法. 以下是本文目录大纲: 一.CountDownLatch用法 二.CyclicBarrier用法 三.Semaphore用法 若有不正之处请多多谅解,并欢迎批评指正. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/dolphin0520/p/3920397.htm

java并发编程学习:用 Semaphore (信号量)控制并发资源

并发编程这方面以前关注得比较少,恶补一下,推荐一个好的网站:并发编程网 - ifeve.com,上面全是各种大牛原创或编译的并发编程文章. 今天先来学习Semaphore(信号量),字面上看,根本不知道这东西是干啥的,借用 并发工具类(三)控制并发线程数的Semaphore一文中的交通红绿信号灯的例子来理解一下: 一条4车道的主干道,假设100米长,每辆车假设占用的长度为10米(考虑到前后车距),也就是说这条道上满负载运行的话,最多只能容纳4*(100/10)=40辆车,如果有120辆车要通过的

以下代码,semaphore会不会引起一些同步的问题(重入),需要修改吗

问题描述 package learn;import java.util.concurrent.Semaphore;class applePlate{static Semaphore apple = new Semaphore(2);static Semaphore space = new Semaphore(3);}class Eater implements Runnable{String name;Object o;Eater(String name, Object o){this.name

java-并发-CountDownLatch、CyclicBarrier和Semaphore

在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法. 以下是本文目录大纲: 一.CountDownLatch用法 二.CyclicBarrier用法 三.Semaphore用法 若有不正之处请多多谅解,并欢迎批评指正. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/dolphin0520/p/3920397.htm