Semaphore(信号灯)
(1)概念
Semaphore可以维护当前访问自身的线程个数,并提供了同步机制。使用Semaphore可以
控制同时访问资源的线程个数,例如实现一个文件允许的并发访问数。
Semaphore实现的功能就类似于餐厅有5个座位,假如有10人要就餐,但同时只能
有5个人能够坐下,当5个人的任何一个人让开后,其中在等待的另外5个人中又有
一个人可以坐下了。
(2)实例
例子:
我们开启了一个动态的缓存线程池,提供了3个信号灯,这样一来一次只有3个线程能拥有
这个信号灯,并且只有有线程使用完信号灯之后,才会有下一个线程获取信号灯并执行。
效果:
可以看到,只有当某一个线程让出其信号灯的使用权之后,其它线程才能够获取信号灯
并且开始执行它自己的线程。
(3)线程获得信号灯的机会
对于另外等待信号灯释放的线程可以是随机获得优先机会,也可以是按照先来后到的顺序获得机会,
这取决于构造Semaphore对象时传入的参数选项。
构造方法摘要:
Semaphore(int permits)
创建具有给定的许可数和非公平的公平设置的 Semaphore。
Semaphore(int permits, boolean fair)
创建具有给定的许可数和给定的公平设置的 Semaphore。
参数:
permits - 初始的可用许可数目。此值可能为负数,在这种情况下,必须在授予任何获取前进行释放。
fair - 如果此信号量保证在争用时按先进先出的顺序授予许可,则为 true;否则为 false。
(4)防止死锁
单个信号量的Semaphore对象可以实现互斥锁的功能,并且可以是由一个线程获得了“锁”,
另一个线程也可以释放该“锁”,这让就防止某个线程死掉了,然后又不释放信号灯的使用权,
此时可以由其线程进行释放。这可应用于死锁恢复的一些场合。
(1)概念
Semaphore可以维护当前访问自身的线程个数,并提供了同步机制。使用Semaphore可以
控制同时访问资源的线程个数,例如实现一个文件允许的并发访问数。
Semaphore实现的功能就类似于餐厅有5个座位,假如有10人要就餐,但同时只能
有5个人能够坐下,当5个人的任何一个人让开后,其中在等待的另外5个人中又有
一个人可以坐下了。
(2)实例
例子:
我们开启了一个动态的缓存线程池,提供了3个信号灯,这样一来一次只有3个线程能拥有
这个信号灯,并且只有有线程使用完信号灯之后,才会有下一个线程获取信号灯并执行。
package cn.edu.hpu.test;
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 = Executors.newCachedThreadPool();//开启一个动态缓存线程池
final Semaphore sp = new Semaphore(3);//设置3个信号灯
for (int i = 0; i < 10; i++) {
Runnable runnable = new Runnable(){
public void run() {
try {
sp.acquire();//获得一盏灯的使用权
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程"+Thread.currentThread().getName()+"进入");
try {
Thread.sleep((long)Math.random()*10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程"+Thread.currentThread().getName()
+"即将离开");
sp.release();//释放信号灯的使用权
System.out.println("线程"+Thread.currentThread().getName()+"已离开。");
}
};
service.execute(runnable);
}
}
}
效果:
可以看到,只有当某一个线程让出其信号灯的使用权之后,其它线程才能够获取信号灯
并且开始执行它自己的线程。
(3)线程获得信号灯的机会
对于另外等待信号灯释放的线程可以是随机获得优先机会,也可以是按照先来后到的顺序获得机会,
这取决于构造Semaphore对象时传入的参数选项。
构造方法摘要:
Semaphore(int permits)
创建具有给定的许可数和非公平的公平设置的 Semaphore。
Semaphore(int permits, boolean fair)
创建具有给定的许可数和给定的公平设置的 Semaphore。
参数:
permits - 初始的可用许可数目。此值可能为负数,在这种情况下,必须在授予任何获取前进行释放。
fair - 如果此信号量保证在争用时按先进先出的顺序授予许可,则为 true;否则为 false。
(4)防止死锁
单个信号量的Semaphore对象可以实现互斥锁的功能,并且可以是由一个线程获得了“锁”,
另一个线程也可以释放该“锁”,这让就防止某个线程死掉了,然后又不释放信号灯的使用权,
此时可以由其线程进行释放。这可应用于死锁恢复的一些场合。
转载请注明出处:http://blog.csdn.net/acmman/article/details/52948307