v最近JAVA写了一个NIO服务器DEMO,结果老师有问题,一直没找到原因。客户端请求一直没在服务端处理。下面上图:


上面的代码看上去没啥问题,但是运行的时候一请求就没有返回,后来发现时用为在handleAccept方法里面调用了register方法。

由于selector.select(3000)
会锁定 select对象中的publicKeys

socket.register(selector,SelectionKey.OP_READ)
方法在执行时也会获取同步锁 publicKeys[图片上传中...(image.png-b53fb-1550740002748-0)]

由于上面时用的同一个selector而在处理事件的时候又使用了多线程,所以会导致RequestHandler还没有执行register的时候 Server程序又执行到了selector.select(),从而导致register的时候由于等待publicKeys锁而无法完成OP_READ(可读事件)的注册。从而无法收到消息。
handleAccept 如果时多线程就会出现上面的问题。
网友评论