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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

光仔December

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值