信号量目的:1)用于多个共享资源的互斥使用 2)用于并发线程数的控制。(多对多)
/**
* @author luffy
**/
public class SemaphoreDemo {
public static void main(String[] args){
Semaphore semaphore = new Semaphore(6); //可复用-可伸缩
for(int i =0 ;i< 10;i++){
new Thread(()->{
try {
semaphore.acquire();
System.out.println(Thread.currentThread().getName()+":抢到车位!");
try {
TimeUnit.SECONDS.sleep(3); //停车3s
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+":停车3s后离开车位!");
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
semaphore.release();
}
},String.valueOf(i)).start();
}
}
}
Semaphore可以控同时访问的线程个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。
CountDownLatch一般用于某个线程A等待若干个其他线程执行完任务之后,它才执行;而CyclicBarrier一般用于一组线程互相等待至某个状态,然后这一组线程再同时执行;另外,CountDownLatch是不能够重用的,而CyclicBarrier是可以重用的。
Semaphore和锁类似,它一般用于控制对某组资源的访问权限。
网友评论