程序员

netty源码分析(11)-NioEventLoop总结

2019-02-21  本文已影响0人  Jorgezhong

前面花了5节的篇幅来学习和研究NioEventLoop的创建,启动,执行的过程。总结一下

几个问题:

  1. 默认情况下,Netty服务端开启多少个线程?何时启动

开启2倍的CPU核心数的线程,在调用execute()的时候,会判断当前线程是否是NioEventLoop持有的线程,如果是的话,表示已经启动;不是的话,表面外部线程调用本eventLoop,嗲用startThread()方法,判断当前线程是否有启动,没有则启动这个线程。

  1. netty是如何解决jdk空论的bug的

netty通过计数的方式,如果阻塞了一个select操作,实际上并没有花这么长时间,那么有可能出发了一次空轮询的bug,默认情况下,这个现象达到512次,则重建一个Selector,把原Selector上面所有的key移交到新的。通过这种方式避免。

  1. netty如何保证异步串行无锁化?

在所有外部线程调用NioEventLoopChannle的方法的时候,通过inEventLoop方法来判断当前线程是本NioEventLoop持有的线程(是否是外部线程),外部线程的话,则把所有操作封装成一个task,丢到taskQueue里面。而这个队列里的task将会在NioEventLoop执行的第三个阶段runAllTask()中挨个执行,保证串行无锁化。

上一篇 下一篇

猜你喜欢

热点阅读