📝个人主页🌹:个人主页
⏩收录专栏⏪:JAVA进阶
🌹🌹期待您的关注 🌹🌹,让我们共同进步!
CountDownLatch的问题是不能复用。比如count=3,那么加到3,就不能继续操作了。而Semaphore可以解决这个问题,比如6辆车3个停车位,对于CountDownLatch只能停3辆车,而Semaphore可以停6辆车,车位空出来后,其它车可以占有,这就涉及到了Semaphore.accquire()和Semaphore.release()方法。
在信号量上我们定义两种操作:
● acquire(获取) 当一个线程调用acquire操作时,它要么通过成功获取信号量(信号量减1),要么一直等下去,直到有线程释放信号量,或超时。
● release(释放)实际上会将信号量的值加1,然后唤醒等待的线程。
信号量主要用于两个目的,一个是用于多个共享资源的互斥使用,另一个用于并发线程数的控制。
例子:6台车抢占3个车位
public class SemaphoreDemo {
public static void main(String[] args) {
Semaphore semaphore = new Semaphore(3); // 模拟资源类有3个空车位
for (int i = 1; i < 7; i++) {
new Thread(() -> {
try {
semaphore.acquire(); // 当前线程抢占,信号量-1
System.out.println(Thread.currentThread().getName()+"\t抢占到了车位");
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"\t离开了车位");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release(); // 当前线程释放,信号量+1
}
}, "Thread" + i).start();
}
}
}
CountDownLatch 减少技术:【多线程】Java并发工具类之CountDownLatch 同步协作的利器
CyclicBarrier循环栅栏:JAVA高级】并发同步工具CyclicBarrier 的使用介绍