waitSelection和注册时的疑问

来源:7-13 NIO知识归纳梳理

慕斯卡8299126

2021-07-04

图片描述
这个方法,我没看明白他的作用在哪里,如果进入了同步块,然后get是false,此时没有释放锁的方法,那是不是就是死锁了?
还有一个疑问,为啥注册的时候需要wakeup去打断select,是因为如果不唤醒一直让select就会select不到新注册的channel吗?

写回答

1回答

Qiujuer

2021-07-16

这里的写法上的确是有问题的,在后面会有说明。

我们说一下,为啥需要去打断select;这是因为select状态下其实会占用锁,导致其他的注册操作无法正常注册,一直处于等待状态。

我们的机制则是:

  1. A线程标记要进行注册

  2. A线程打断select线程

  3. select线程释放锁后发现A有标记进行注册,则进行等待

  4. A真正进行注册操作

  5. A注册成功后将标记改回去

  6. select发现标记没有了,然后继续走后续逻辑进行循环监听


这里可能还存在B线程也要来注册的情况,所以往往需要对这个标记和取消标记的过程进行加锁。


当然更加优秀的方案是将select、注册、解除注册的过程都放一个线程来做,这样就可以最大程度减少线程相互打断唤醒的情况。

0
0

Socket网络编程进阶与实战 系统掌握Socket核心技术

理论+实践,系统且深入掌握Socket核心技术,从容应对各种Socket应用场景的不二之选

2324 学习 · 476 问题

查看课程