【Java多线程与并发库】12.java5的Semaphere同步工具

来源:互联网 发布:遥感影像匀光匀色软件 编辑:程序博客网 时间:2024/06/05 15:45
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

1 0
原创粉丝点击