为什么每次read之后都要调用这个方法重新注册一次呢?

来源:2-1 什么是网络编程?

qq_慕前端1318791

2021-08-20

图片描述

写回答

2回答

Qiujuer

2021-08-30

因为我们的Select线程与后面处理任务的线程并不是同一个线程,所以得到事件后如果不取消注册则会导致Select线程,反复的得到事件就绪的通知,从而导致处理任务的线程中出现n个同样的任务;也就会导致后面的数据处理出现异常,因为数据本身是有序的,并不能混乱,所以这里不能进行多线程同时收发。

这里的数据是指单链接的数据本身,而不是多链接。多个链接之间相互是无感的,可并发的;但在一个链接内部的数据应该保持其有序性。

关于你说的锁粒度大导致的效率问题,的确存在,后面的课程也有这块儿的优化,可以继续往后看看哈。

0
0

qq_慕前端1318791

提问者

2021-08-20

我自己又多看了几遍代码明白了。因为在handleSelection方法中,为了防止重复读取同一消息,取消了监听,所以这里要重新注册监听。但这样重复上锁,而且感觉锁的粒度挺大的,会不会影响效率啊。

0
0

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

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

2324 学习 · 476 问题

查看课程