本篇文章主要介绍了"JAVA并发编程--Semaphore、CountDownLatch、ReentrantLock、CyclicBarrier",主要涉及到方面的内容,对于Javajrs看球网直播吧_低调看直播体育app软件下载_低调看体育直播感兴趣的同学可以参考一下:
Semaphore学习操作系统理论课的时候,教材上应该都会讲过信号量这种概念,java.util.concurrent.Semaphore类就是Java中这个概...
Semaphore
学习操作系统理论课的时候,教材上应该都会讲过信号量这种概念,java.util.concurrent.Semaphore类就是Java中这个概念的实现。比如资源R有5个实体,如果每个线程执行的过程中需要用到1个,那么允许5个线程并发执行,第6个会等待其他线程释放资源后继续执行。
Semaphore实际上就是把锁的限制从1变为N
- state存储的是表示剩余可用资源的值
- Node采用的是SHARED模式
- 获得锁之后会尝试传播,释放更多锁
先看一个应用Semaphore的例子:
其中最主要的方法就是acquire()和release(),更详细的可以参看Oracle的API文档。
ExecutorService exec = Executors.newCachedThreadPool();
final Semaphore sem = new Semaphore(5);
for (int i = 1; i < 100; i++) {
finalint tid = i;
Runnable semTask = new Runnable() {
publicvoidrun() {
try {
sem.acquire();
System.out.println("running thread with id: " + tid);
Thread.sleep((long) (Math.random() * 3000));
System.out.println("completing with id: " + tid);
sem.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
exec.execute(semTask);
}
exec.shutdown();
CountDownLatch
java.util.concurrent.CountDownLatch这个类从名字就可以看出,是以一个递减计数器为基础,多个线程共享这样一个对象,开启一个计数值,某些线程可以等待这个计数器值为0的时候继续任务,调用await(),而那些改变状态的线程需要做的就是使计数器递减,调用countDown()方法。