waitSelection和注册时的疑问
来源:7-13 NIO知识归纳梳理
慕斯卡8299126
2021-07-04

这个方法,我没看明白他的作用在哪里,如果进入了同步块,然后get是false,此时没有释放锁的方法,那是不是就是死锁了?
还有一个疑问,为啥注册的时候需要wakeup去打断select,是因为如果不唤醒一直让select就会select不到新注册的channel吗?
写回答
1回答
-
Qiujuer
2021-07-16
这里的写法上的确是有问题的,在后面会有说明。
我们说一下,为啥需要去打断select;这是因为select状态下其实会占用锁,导致其他的注册操作无法正常注册,一直处于等待状态。
我们的机制则是:
A线程标记要进行注册
A线程打断select线程
select线程释放锁后发现A有标记进行注册,则进行等待
A真正进行注册操作
A注册成功后将标记改回去
select发现标记没有了,然后继续走后续逻辑进行循环监听
这里可能还存在B线程也要来注册的情况,所以往往需要对这个标记和取消标记的过程进行加锁。
当然更加优秀的方案是将select、注册、解除注册的过程都放一个线程来做,这样就可以最大程度减少线程相互打断唤醒的情况。
00
相似问题