countdownlatch为什么实现的是共享锁
看源码是
protected int tryAcquireShared(int acquires) {
return (getState() == 0) ? 1 : -1;
}
这个也只有一个线程可以获取资源吧。其他线程获取不到又排队了。不就违背了共享锁可以多个线程同时获取资源吗。没太理解求大佬说明一下
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
首先并不是只有一个线程可以获取该资源。该代码的意思是:当
state
的数值为0时,调用其await()
方法的线程将得到通知,可以不用再阻塞了,继续执行代码。举个很简单的例子,现在state的数值为1,此时有三个线程
A,B,C
正处于等待获取锁的位置(即在调用countdownlatch.await()
方法)。如果有一个D线程使得state
的数值变为0了,那么A、B、C
三个线程会怎样?答案自然是均不用再等待了,都继续执行了。所以对于
ABC
线程来说这就是共享锁。那么排他锁呢?假设还是当
state
为0时,线程才会获得锁。举例:现在state
变为0了,如果这个时候A先拿到了这个锁,那么它会使得state+1
,此时BC自然还得继续等待。与前面的一对比是不是就能感受到为啥这把锁是共享的了?你的误区在于,没有站在
ABC
的角度上去看待这把锁,其次是忽视了事实上,只要当state
为0时,等待这把锁的全部线程均可以全部获得锁从而继续执行代码。