NIO源碼閱讀(1)-SelectorProvider

概述

SelectorProvider定義了創(chuàng)建selector、ServerSocketChannel、SocketChannel等方法马绝,采用Java的 Service Provider Interface (SPI) 方式實現(xiàn)嫂拴。

SelectorProvider創(chuàng)建過程

private static final Object lock = new Object();
private static SelectorProvider provider = null;
 public static SelectorProvider provider() {
        synchronized (lock) {
            if (provider != null)
                return provider;
            return AccessController.doPrivileged(
                new PrivilegedAction<SelectorProvider>() {
                    public SelectorProvider run() {
                            if (loadProviderFromProperty())
                                return provider;
                            if (loadProviderAsService())
                                return provider;
                            provider = sun.nio.ch.DefaultSelectorProvider.create();
                            return provider;
                        }
                    });
        }
    }

    public abstract DatagramChannel openDatagramChannel()
        throws IOException;

    public abstract DatagramChannel openDatagramChannel(ProtocolFamily family)
        throws IOException;

    public abstract Pipe openPipe() throws IOException;

    public abstract AbstractSelector openSelector()
        throws IOException;

    public abstract ServerSocketChannel openServerSocketChannel()
        throws IOException;

    public abstract SocketChannel openSocketChannel()
        throws IOException;

SelectorProvide中定義了私有的成員變量provider,提供了provider方法進行創(chuàng)建杠园;從代碼可以看到顾瞪,創(chuàng)建的過程為:

  • 如果provider已經(jīng)創(chuàng)建,直接返回;
  • 如果定義了java.nio.channels.spi.SelectorProvider屬性抛蚁,則采用該屬性定義的類創(chuàng)建SelectorProvider并返回陈醒;如果失敗,則繼續(xù)瞧甩;
  • 采用SPI方法創(chuàng)建SelectorProvider并返回钉跷;如果實現(xiàn),則通過DefaultSelectorProvider創(chuàng)建肚逸;

關于SPI機制爷辙,有興趣的可以自行查閱文檔彬坏,這邊簡單描述下:
SPI是提供給服務提供廠商與擴展框架功能的開發(fā)者使用的接口;例如java定義了方法數(shù)據(jù)庫的jdbc接口膝晾,而具體的實現(xiàn)由每家數(shù)據(jù)庫廠商自己實現(xiàn)栓始,它采用的就是SPI機制:

  • 在META-INF/services/目錄中創(chuàng)建以接口全限定名命名的文件,內容為API具體實現(xiàn)類的全限定名;
  • 使用ServiceLoader類動態(tài)加載META-INF中的實現(xiàn)類;
  • 如SPI的實現(xiàn)類為Jar則需要放在主程序classPath中;
  • API具體實現(xiàn)類必須有一個不帶參數(shù)的構造方法。

具體到NIO,一般都是采用DefaultSelectorProvider創(chuàng)建血当;
在Java的源碼里幻赚,對應不同操作系統(tǒng)平臺,由不同的實現(xiàn)臊旭,在Linux平臺下坯屿,源碼為:

public class DefaultSelectorProvider {

    private DefaultSelectorProvider() { }

    public static SelectorProvider create() {
        String osname = AccessController.doPrivileged(
            new GetPropertyAction("os.name"));
        if ("SunOS".equals(osname)) {
            return new sun.nio.ch.DevPollSelectorProvider();
        }

        // Linux內核2.6及以上版本,采用EPollSelectorProvider,
       //低版本內核使用PollSelectorProvider
        if ("Linux".equals(osname)) {
            String osversion = AccessController.doPrivileged(
                new GetPropertyAction("os.version"));
            String[] vers = osversion.split("\\.", 0);
            if (vers.length >= 2) {
                try {
                    int major = Integer.parseInt(vers[0]);
                    int minor = Integer.parseInt(vers[1]);
                    if (major > 2 || (major == 2 && minor >= 6)) {
                        return new sun.nio.ch.EPollSelectorProvider();
                    }
                } catch (NumberFormatException x) {
                }
            }
        }

        return new sun.nio.ch.PollSelectorProvider();
    }

}

可以看到對應目前的主流Linux平臺而言巍扛,都是采用Epoll機制實現(xiàn)领跛;

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市撤奸,隨后出現(xiàn)的幾起案子吠昭,更是在濱河造成了極大的恐慌,老刑警劉巖胧瓜,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件矢棚,死亡現(xiàn)場離奇詭異,居然都是意外死亡府喳,警方通過查閱死者的電腦和手機蒲肋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钝满,“玉大人兜粘,你說我怎么就攤上這事⊥溲粒” “怎么了孔轴?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長碎捺。 經(jīng)常有香客問我路鹰,道長,這世上最難降的妖魔是什么收厨? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任晋柱,我火速辦了婚禮,結果婚禮上诵叁,老公的妹妹穿的比我還像新娘雁竞。我一直安慰自己,他們只是感情好黎休,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布浓领。 她就那樣靜靜地躺著,像睡著了一般势腮。 火紅的嫁衣襯著肌膚如雪联贩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天捎拯,我揣著相機與錄音泪幌,去河邊找鬼。 笑死署照,一個胖子當著我的面吹牛祸泪,可吹牛的內容都是我干的。 我是一名探鬼主播建芙,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼没隘,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了禁荸?” 一聲冷哼從身側響起右蒲,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赶熟,沒想到半個月后瑰妄,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡映砖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年间坐,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片邑退。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡竹宋,死狀恐怖,靈堂內的尸體忽然破棺而出地技,到底是詐尸還是另有隱情逝撬,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布乓土,位于F島的核電站宪潮,受9級特大地震影響,放射性物質發(fā)生泄漏趣苏。R本人自食惡果不足惜狡相,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望食磕。 院中可真熱鬧尽棕,春花似錦、人聲如沸彬伦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至回官,卻和暖如春曹宴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背歉提。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工笛坦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人苔巨。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓版扩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親侄泽。 傳聞我的和親對象是個殘疾皇子礁芦,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)悼尾,斷路器宴偿,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • /Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home...
    光劍書架上的書閱讀 3,856評論 2 8
  • 從三月份找實習到現(xiàn)在,面了一些公司诀豁,掛了不少窄刘,但最終還是拿到小米、百度舷胜、阿里娩践、京東、新浪烹骨、CVTE翻伺、樂視家的研發(fā)崗...
    時芥藍閱讀 42,184評論 11 349
  • 下午四點,我離開辦公室沮焕,準備下班回家吨岭,前幾天下的雪還沒有化盡,今天又淅淅瀝瀝的下了一整天的雨峦树,空氣中滿是冷冽的寒氣...
    浮萍不浮閱讀 376評論 0 1
  • 珠簾雨后舒半卷辣辫,一丈朝陽在庭中。 冷酒連宵人幾似魁巩,殘香入夢恨千重急灭。 飛云誤解鐘樓語,垂柳難扶曲水風谷遂。 小盞紅茶新浸...
    長安舊人閱讀 264評論 1 10