Dict.CN 在線詞典, 英語學習, 在線翻譯

          都市淘沙者

          荔枝FM Everyone can be host

          導航

          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          公告


          我的blog中的部分資源是來自于網絡上,如果你認為侵犯了你的權利,請及時聯系jelver#163.com,我會盡快刪除!另外如果要留言最好通過郵件的形式跟我交流因為我不是很經常寫文章,前面有的朋友留言好久了我才發現,所以對不住大家,現在留下MSN:jelver#163.com和QQ:253840881,歡迎交流! (用@代替#)

          隨筆分類

          文章分類

          隨筆檔案

          文章檔案

          相冊

          統計

          留言簿(23)

          積分與排名

          優秀學習網站

          友情連接

          閱讀排行榜

          評論排行榜

          java nio在多線程環境需注意的問題

          原帖:http://www.aygfsteel.com/adapterofcoms/archive/2010/03/02/314242.html

          有人說java nio在多線程環境下編程簡直就是個惡夢,其實你如果能把握住java nio API的要領,你就可以將之駕馭. 

          0. 一個 channal 對應一個SelectionKey in the same selector.
          e.g:
          SelectionKey sk=sc.register(selector, SelectionKey.OP_READ, handler);
          sk==sc.register(selector, SelectionKey.OP_WRITE, handler) true?
          selector.select() 每次返回的對同一channal的sk是否相同? 

          1.channel.register(...) may block if invoked concurrently with another registration[another.register(...)] or selection operation[selector.select(...)] involving *****the same selector*****.
          這個是register方法jdk src上的原文,
          e.g:
          如果一個selection thread已經在select方法上等待ing,那么這個時候如果有另一條線程調用channal.register方法的話,那么它將被blocking.

          2.selectionKey.cancel() : The key will be removed from all of the selector's key sets during *****the next selection operation[selector.select(...)]*****.
          may block briefly if invoked concurrently with a cancellation[cancel()] or selection operation[select(...)] involving ***the same selector***.
          這個也是cancel方法jdk src上的原文,
          e.g:
          你先將一個selectionKey.cancel(),然后隨即再channel.register to the same selector,
          在cancel和register之間,如果沒有線程(包括當前線程)進行select操作的話,
          那么 throws java.nio.channels.CancelledKeyException.
          所以 cancel-->select-->re-register.  

          3.if don't remove the current selectedKey from selector.selectedKeys()[Set] 將導致 selector.select(...) not block [may be cpu 100%,specially when client cut the current channel(connection)].
          e.g:
          Iterator<SelectionKey> it=selector.selectedKeys().iterator();
          ...for/while it.hasNext()...
          it.remove();<------*****must do it. or Keys' Set.clear() finally; 

          if remove the current selectedKey from selector.selectedKeys()[Set] but don't sk.interestOps(sk.interestOps()& (~sk.readyOps()));將導致 selector.select(...) not block [select() not block several times, or excepted exception] 

          4.op_write should not be registered to the selector.   [may be cpu100%] 

          5. if involving  wakeup() before select() [wakeup called several times >=1],the next select() not block [not block just once]. 

          盡管以前有些人分析了nio的wakeup性能及not block in linux的bug,但是java nio依然是高效的,那些c/c++的牛人們去看看jre/bin目錄下的nio.dll/nio.so吧,java nio是基于select模型(這個是c/c++中常用網絡編程模型之一)的.

          基于java nio的服務器:mina,girzzly[glassfish],jetty(基于girzzly),tomcat6[可以配置Http11NioProtocol]...

          其中從本人對girzzly,tomcat6的源碼分析來看,它們都還沒有真正發揮出nio異步處理請求的優點,它們的讀寫還都是blocking的雖然使用了selectorPool,此外tomcat6要剝離出socket通信還要花費一定的功夫.而mina卻是符其實,還有bug哦.


           

          posted on 2010-05-29 15:53 都市淘沙者 閱讀(2296) 評論(0)  編輯  收藏 所屬分類: 多線程并發編程

          主站蜘蛛池模板: 西乌珠穆沁旗| 平乡县| 界首市| 菏泽市| 广元市| 溆浦县| 津南区| 鸡东县| 林芝县| 曲沃县| 宁海县| 明光市| 红原县| 开封市| 竹山县| 含山县| 拜泉县| 锦州市| 客服| 丰宁| 金昌市| 清丰县| 衢州市| 泸水县| 如东县| 洛南县| 麻城市| 汉沽区| 莱州市| 西贡区| 汕头市| 哈密市| 溧水县| 康定县| 花莲市| 扎兰屯市| 项城市| 镇雄县| 黄龙县| 石景山区| 彩票|