<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    xylz,imxylz

    關注后端架構、中間件、分布式和并發編程

       :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      111 隨筆 :: 10 文章 :: 2680 評論 :: 0 Trackbacks

    常見的并發場景

    線程池

    并發最常見用于線程池,顯然使用線程池可以有效的提高吞吐量。

    最常見、比較復雜一個場景是Web容器的線程池。Web容器使用線程池同步或者異步處理HTTP請求,同時這也可以有效的復用HTTP連接,降低資源申請的開銷。通常我們認為HTTP請求時非常昂貴的,并且也是比較耗費資源和性能的,所以線程池在這里就扮演了非常重要的角色。

    線程池的章節中非常詳細的討論了線程池的原理和使用,同時也提到了,線程池的配置和參數對性能的影響是巨大的。不盡如此,受限于資源(機器的性能、網絡的帶寬等等)、依賴的服務,客戶端的響應速度等,線程池的威力也不會一直增長。達到了線程池的瓶頸后,性能和吞吐量都會大幅度降低。

    一直增加機器的性能或者增大線程的個數,并不一定能有效的提高吞吐量。高并發的情況下,機器的負載會大幅提升,這時候機器的穩定性、服務的可靠性都會下降。

    盡管如此,線程池依然是提高吞吐量的一個有效措施,配合合適的參數能夠有效的充分利用資源,提高資源的利用率。

    任務隊列

    除了線程池是比較發雜的并發場景外,任務隊列也是一個不錯的并發工具。JDK內部有大量的隊列(Queue),這些工具不僅能夠方便使用,提高生產力,也能夠進行組合適應于不同的場景。即使線程池內部,也是用了任務隊列來處理任務的積壓,平衡資源的消耗。

    安全的任務隊列能夠有效的平衡機器的復雜,抵消由于峰值和波動帶來的不穩定,有效提高服務的可靠性。同時任務隊列的處理也有助于統計和分析服務的狀況。

    任務隊列也可以在多個線程之間傳遞數據,有助于并行處理任務。例如經典的“生產者-消費者”模型就可以有效的提高多個線程的并行處理能力。在IO延時比較大的服務中尤其有效。 我最喜歡的一個案例是導數據是,一個線程負責往固定大小的任務隊列中壓入大量的數據,隊列滿了以后就暫停,另外幾個線程負責從任務隊列中獲取數據并消費。這將串行的“生產-消費”,變成了并行的“生產-消費”。實踐證明極大的節省任務處理時間。

    異步處理

    線程池也是異步處理的一種表現形式,除此之外,使用異步處理的目的也是為了提高服務的處理速度。 例如AOP的一個例子就是使用切面來記錄日志,如果說我們要遠程收集日志,顯然不希望由于收集日志而影響服務本身。這時候就將日志收集的過程進行異步處理。

    如今大量的開源組件都喜歡使用異步處理來提高IO的效率,某些不需要同步返回的操作使用異步處理后能夠有效的提高吞吐量。

    當然,異步也不總是令人滿意的,也會有相應的問題。例如引入異步設計后的復雜性,線程中斷后的處理機制,失敗后的處理策略,產生的消息比消費的還快時怎么辦,關閉程序時如何關閉異步處理邏輯等等。這都會增加系統的復雜性。

    盡管大量的服務、業務使用異步來處理,但是很顯然需要有保障機制能夠保證異步處理的邏輯正確性。如果認為異步處理的任務不是特別重要,或者說主業務不能因為附屬業務的邏輯出錯而崩潰,那么使用異步處理是正確的選擇。

    同步操作

    并發操作的同時還需要維護數據的一致性,或多或少的會涉及到同步操作。正確的使用原子操作,合理的使用獨占鎖和讀寫鎖也是一個很大的挑戰。

    線程間的協調與通信,尤其是狀態的同步都是比較困難的。我們看到線程池ThreadPoolExecutor的實現為了解決各個線程的執行狀態,引入的很多的同步操作。線程越來越多的情況下,同步的成本會越來越高,同時也有可能引入死鎖的情況。

    盡管如此,單個JVM內部的多線程同步還是比較容易控制的。JDK內部也提供了大量的工具來方便完成數據的同步。例如Lock/Condition/CountDownLatch/CyclicBarrier/Semaphore/Exchanger等等。

    分布式鎖

    分布式的并發問題更難以處理,根據CAP的原理,基本上沒有一個至善至美的方案。 分布式資源協調使用分布式鎖是一個不錯的選擇。Google的分布式鎖(建立在BigTable之上),Zookeeper的分布式鎖,甚至簡單的利用memcache的add操作或者redis的setnx操作建立偽分布式鎖也可以解決類似的問題。



    ©2009-2014 IMXYLZ |求賢若渴
    posted on 2011-12-29 16:31 imxylz 閱讀(8140) 評論(0)  編輯  收藏 所屬分類: Java Concurrency

    ©2009-2014 IMXYLZ
    主站蜘蛛池模板: 中文字幕视频免费在线观看| 国产免费伦精品一区二区三区| 国产午夜亚洲精品理论片不卡 | 免费网站看av片| 一级做a爱过程免费视| 亚洲av永久中文无码精品 | 蜜桃视频在线观看免费网址入口| 97视频热人人精品免费| 最近在线2018视频免费观看| 午夜无遮挡羞羞漫画免费| 动漫黄网站免费永久在线观看| 97久久免费视频| 香蕉97超级碰碰碰免费公| 在线观看永久免费| 午夜国产精品免费观看 | 亚洲αv久久久噜噜噜噜噜| 亚洲国产婷婷六月丁香| 亚洲成亚洲乱码一二三四区软件| 亚洲AV无码成人精品区在线观看| 亚洲国产高清在线| 亚洲精品无码少妇30P| 视频免费1区二区三区| 成人性生交大片免费看中文| 久久青草免费91观看| 久久国产免费福利永久| 国产免费无遮挡精品视频| 亚洲真人日本在线| 亚洲一区二区三区四区在线观看| 亚洲欧洲精品一区二区三区| 亚洲一区二区三区乱码在线欧洲| 国产精品无码亚洲精品2021| 国产激情免费视频在线观看| 韩国日本好看电影免费看| 亚洲国产精品一区二区久久hs| 亚洲综合偷自成人网第页色| 人妻仑刮八A级毛片免费看| 无码人妻精品中文字幕免费东京热| 免费国产小视频在线观看| 亚洲男人电影天堂| 大地资源在线资源免费观看| 日本在线观看免费高清|