Java并发——Semaphore信号量
2017-10-27 本文已影响80人
耳_总
Semephore类是java.util.concurrent包下处理并发的工具类,Semephore能够控制任务访问资源的数量,如果资源不够,则任务阻塞,等待其他资源的释放。
比如一个停车场有三个车位,当车位空余数量小于3时,车辆可以进入停车场停车。如果停车场已经没有了空余车位,后面来的车就不能进入停车场,只能在停车场外等待,等其他车辆离开之后才能进入。
Semephore类的主要方法
-
构造方法:
Semaphore(int permits)
Semaphore(int permits, boolean fair)
有两个构造方法,第一个参数表示可以同时访问资源的最大任务数,第二个是个boolean类型,表示是否公平锁。
公平锁和非公平锁:程序在执行并发任务的时候,拿到同步锁的任务执行代码,其他任务阻塞等待,一旦同步锁被释放,CPU会正在等待的任务分配资源,获取同步锁。在这里又两种策略,CPU默认从等待的任务中随机分配,这是非公平锁;公平锁是按照等待时间优先级来分配,等待的时间越久,先获取任务锁。其内部是一个同步列队实现的。 -
主要方法
acquire();获取许可,Semephore任务数加一
release();释放许可,Semephore任务数减一
还有几个方法如tryAcquire()尝试获取许可,返回boolean值,不阻塞。availablePermits()还剩几个任务许可,等等几个方法和Lock类的用法相似。 -
代码示例:
public static void main(String[] args) {
Semaphore semaphore = new Semaphore(3);
ExecutorService exec = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
exec.execute(new Task(semaphore));
}
// semaphore.acquireUninterruptibly(3);
exec.shutdown();
}
public static class Task implements Runnable {
private Semaphore semaphore;
public Task(Semaphore semaphore) {
this.semaphore = semaphore;
}
@Override
public void run() {
try {
semaphore.acquire();
System.out.println(Thread.currentThread().getName() + "获取了资源");
TimeUnit.SECONDS.sleep(1);
System.out.println(Thread.currentThread().getName() + "准备释放资源");
semaphore.release();
System.out.println(Thread.currentThread().getName() + "释放了资源");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
输出:
pool-1-thread-1获取了资源
pool-1-thread-2获取了资源
pool-1-thread-3获取了资源
pool-1-thread-3准备释放资源
pool-1-thread-1准备释放资源
pool-1-thread-1释放了资源
pool-1-thread-3释放了资源
pool-1-thread-2准备释放资源
pool-1-thread-2释放了资源
pool-1-thread-5获取了资源
pool-1-thread-4获取了资源
pool-1-thread-6获取了资源
pool-1-thread-6准备释放资源
pool-1-thread-5准备释放资源
pool-1-thread-4准备释放资源
pool-1-thread-4释放了资源
pool-1-thread-7获取了资源
pool-1-thread-5释放了资源
pool-1-thread-8获取了资源
pool-1-thread-6释放了资源
pool-1-thread-9获取了资源
pool-1-thread-8准备释放资源
pool-1-thread-7准备释放资源
pool-1-thread-10获取了资源
pool-1-thread-9准备释放资源
pool-1-thread-9释放了资源
pool-1-thread-7释放了资源
pool-1-thread-8释放了资源
pool-1-thread-10准备释放资源
pool-1-thread-10释放了资源