Java中的Semaphore

介绍

Semaphore是Java提供的另一种锁机制,称为信号量,它可允许指定数量的多个线程同时拥有一个信号量。区别于锁的关键在于,锁是为了保证资源的安全而设计的,而信号量是为了限制资源的并发数,对性能进行考虑而设计。

设计原理

它通过维护一个计数器来限制访问的线程的数量,若增加一个线程的访问时,信号量减一,直到信号量为0时,则无法加入新的访问的线程,这些线程将等待信号量的增加,如大于0,则等待的线程即可资源进行访问。例如,当有信号量总额为5时,10个线程并发访问某个资源,当有5个线程访问的时候,信号量为0,当有线程释放信号量时,等待的线程即可执行。
在这里插入图片描述

代码实现

核心API:
构造函数:

public Semaphore(int permits);						//信号量个数
public Semaphore(int permits,boolean fair);			//第二个参数为是否公平

主要的逻辑方法:

public void acquire();							//获取信号量,获取信号量,获取不到则到等待区等待	
public void acquireUniterruptibly();			//不支持中断的获取信号量
public boolean tryAcquire();					//尝试获取信号量,类似tryLock();
public boolean tryAcquire(long timeout,TimeUnit unit);	//尝试获取信号量,获取不到则进行等待的时间
public void release();							//释放信号量

例子:

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 exec = Executors.newFixedThreadPool(20);
        Semaphore semp = new Semaphore(5);
        for (int i = 0;i<20;i++){
            exec.submit(new MyTask(semp));
        }
        exec.shutdown();
    }

    private static class MyTask implements Runnable{
        private Semaphore semaphore;
        public MyTask(Semaphore semaphore){
            this.semaphore = semaphore;
        }
        @Override
        public void run() {
            try {
                semaphore.acquire();
                Thread.sleep(2000);     //模拟2S的线程操作
                System.out.println(System.currentTimeMillis() +  ":done!");
                semaphore.release();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值