這個(gè)應(yīng)該是很老的bug了,linux平臺(tái),jdk6好像就修復(fù)了
bug 描述 :https://bugs.java.com/bugdata...
This is an issue with poll (and epoll) on Linux. If a file descriptor for a connected socket is polled with a request event mask of 0, and if the connection is abruptly terminated (RST) then the poll wakes up with the POLLHUP (and maybe POLLERR) bit set in the returned event set. The implication of this behaviour is that Selector will wakeup and as the interest set for the SocketChannel is 0 it means there aren"t any selected events and the select method returns 0.
之前一直不知道event mask 為0 代表啥,知道翻到了資料
http://man7.org/linux/man-pag...
The field events is an input parameter, a bit mask specifying the
events the application is interested in for the file descriptor fd.
This field may be specified as zero, in which case the only events
that can be returned in revents are POLLHUP, POLLERR, and POLLNVAL
(see below).
大概知道了0代表了POLLHUP, POLLERR, and POLLNVA 這些event
繼續(xù)查閱https://blog.csdn.net/tilter/...
常量 說(shuō)明
POLLIN 普通或優(yōu)先級(jí)帶數(shù)據(jù)可讀
POLLRDNORM 普通數(shù)據(jù)可讀
POLLRDBAND 優(yōu)先級(jí)帶數(shù)據(jù)可讀
POLLPRI 高優(yōu)先級(jí)數(shù)據(jù)可讀
POLLOUT 普通數(shù)據(jù)可寫
POLLWRNORM 普通數(shù)據(jù)可寫
POLLWRBAND 優(yōu)先級(jí)帶數(shù)據(jù)可寫
POLLERR 發(fā)生錯(cuò)誤
POLLHUP 對(duì)方描述符掛起
POLLNVAL 描述字不是一個(gè)打開的文件
大概明白了Bug描述中 abruptly terminated (RST)的含義及發(fā)生場(chǎng)景
也就知道什么時(shí)候會(huì)發(fā)生空輪詢bug
個(gè)人記錄下
還有1問(wèn)題沒想明白,為啥先cancel,再select(or selectNow) 還是無(wú)法避免這個(gè)問(wèn)題? ref: https://www.cnblogs.com/JAYIT...
網(wǎng)上說(shuō),在多線程環(huán)境下,selectNow先發(fā)生,cancel后發(fā)生,這樣還是會(huì)存在問(wèn)題
但是,即使cancel后發(fā)生,channel也會(huì)被移到待移除channel集合了,下次再輪詢的時(shí)候,select也會(huì)出發(fā)這個(gè)集合里面的channel被清除
這樣,最多多一次空輪訓(xùn)。
目前給的方案都是open一個(gè)新的selector,把有效的channel全部注冊(cè)到新的selector,再輪詢新的selector
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/76839.html
摘要:主從模型主從多線程多個(gè)的線程池用于接受客戶端的連接。負(fù)責(zé)多路分離已連接的,讀寫網(wǎng)絡(luò)數(shù)據(jù),將業(yè)務(wù)處理功能扔給線程池完成。比如在線程內(nèi)部進(jìn)行串行操作,避免多線程競(jìng)爭(zhēng)造成的性能問(wèn)題。 歡迎關(guān)注公眾號(hào):【愛編程】如果有需要后臺(tái)回復(fù)2019贈(zèng)送1T的學(xué)習(xí)資料哦!! showImg(https://upload-images.jianshu.io/upload_images/13150128-3c...
摘要:即可以理解為,方法都是異步的,完成后會(huì)主動(dòng)調(diào)用回調(diào)函數(shù)。主要在包下增加了下面四個(gè)異步通道其中的方法,會(huì)返回一個(gè)帶回調(diào)函數(shù)的對(duì)象,當(dāng)執(zhí)行完讀取寫入操作后,直接調(diào)用回調(diào)函數(shù)。 本文原創(chuàng)地址,我的博客:jsbintask.cn/2019/04/16/…(食用效果最佳),轉(zhuǎn)載請(qǐng)注明出處! 在理解什么是BIO,NIO,AIO之前,我們首先需要了解什么是同步,異步,阻塞,非阻塞。假如我們現(xiàn)在要去銀行取...
摘要:?jiǎn)?dòng)然后一路執(zhí)行到方法中,調(diào)用方法啟動(dòng)線程。的執(zhí)行流程中的方法是一個(gè)無(wú)限循環(huán)的線程,在該循環(huán)中主要做三件事情,如圖所示。而這個(gè)喚醒是沒有任何讀寫請(qǐng)求的,從而導(dǎo)致線程在做無(wú)效的輪詢,使得占用率較高。 上一篇文章,分析了Netty服務(wù)端啟動(dòng)的初始化過(guò)程,今天我們來(lái)分析一下Netty中的Reactor線程模型在分析源...
摘要:一個(gè)多路復(fù)用器可以負(fù)責(zé)成千上萬(wàn)的通道,沒有上限。不需要通過(guò)對(duì)多路復(fù)用器對(duì)注冊(cè)的通道進(jìn)行輪詢操作即可實(shí)現(xiàn)異步讀寫,從而簡(jiǎn)化編程模型。同時(shí),支持支持如果是怎么辦最后,到目前位置,支持不支持二無(wú)法擴(kuò)展作為的核心,無(wú)法擴(kuò)展,私有構(gòu)造函數(shù)。 前言 netty 學(xué)習(xí) 基于 netty in action 5th, 官網(wǎng)資料,網(wǎng)絡(luò)博客等 1.1 Why Netty? netty 是一個(gè)中間層的抽象 ...
摘要:后改良為用線程池的方式代替新增線程,被稱為偽異步。最大的問(wèn)題是阻塞,同步。每次請(qǐng)求都由程序執(zhí)行并返回,這是同步的缺陷。這些都會(huì)被注冊(cè)在多路復(fù)用器上。多路復(fù)用器提供選擇已經(jīng)就緒狀態(tài)任務(wù)的能力。并沒有采用的多路復(fù)用器,而是使用異步通道的概念。 Netty是一個(gè)提供異步事件驅(qū)動(dòng)的網(wǎng)絡(luò)應(yīng)用框架,用以快速開發(fā)高性能、高可靠的網(wǎng)絡(luò)服務(wù)器和客戶端程序。Netty簡(jiǎn)化了網(wǎng)絡(luò)程序的開發(fā),是很多框架和公司...
閱讀 787·2021-11-11 16:54
閱讀 1517·2021-08-24 10:01
閱讀 1911·2019-08-30 15:54
閱讀 3296·2019-08-29 14:02
閱讀 3130·2019-08-28 18:22
閱讀 2245·2019-08-28 18:09
閱讀 3698·2019-08-26 10:26
閱讀 2665·2019-08-23 18:23