成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

多線程編程完全指南

mengera88 / 1966人閱讀

摘要:在這個范圍廣大的并發(fā)技術(shù)領(lǐng)域當中多線程編程可以說是基礎(chǔ)和核心,大多數(shù)抽象并發(fā)問題的構(gòu)思與解決都是基于多線程模型來進行的。一般來說,多線程程序會面臨三類問題正確性問題效率問題死鎖問題。

多線程編程或者說范圍更大的并發(fā)編程是一種非常復(fù)雜且容易出錯的編程方式,但是我們?yōu)槭裁催€要冒著風(fēng)險艱辛地學(xué)習(xí)各種多線程編程技術(shù)、解決各種并發(fā)問題呢?

因為并發(fā)是整個分布式集群的基礎(chǔ),通過分布式集群不僅可以大大降低同等負載能力的價格,還能使整體可擴展到的負載能力上限大大提升。低廉的服務(wù)成本使互聯(lián)網(wǎng)行業(yè)的創(chuàng)意井噴,任何一個人都有能力創(chuàng)建并維持一個服務(wù)于成百上千甚至數(shù)萬人的應(yīng)用服務(wù);而極高的服務(wù)能力上限讓無數(shù)業(yè)務(wù)的線上化成為了可能,大大拓寬了互聯(lián)網(wǎng)技術(shù)與業(yè)務(wù)的邊界。

在這個范圍廣大的并發(fā)技術(shù)領(lǐng)域當中多線程編程可以說是基礎(chǔ)和核心,大多數(shù)抽象并發(fā)問題的構(gòu)思與解決都是基于多線程模型來進行的。而且這些并發(fā)問題的本質(zhì)都是相同的,不管是線程并發(fā)、進程并發(fā)還是服務(wù)器級別的并發(fā)都具有類似的特點、面臨相似的問題,多線程編程正是我們切入這個領(lǐng)域、學(xué)習(xí)并發(fā)問題解決方案的最好途徑。所以,在現(xiàn)在的計算機行業(yè)中,多線程編程不僅是Java程序員技術(shù)面試、進階提高的重要知識領(lǐng)域,而且也是后端程序員敲開分布式系統(tǒng)實現(xiàn)大門的入場券。如果不能理解并發(fā)程序的特點與問題,那么就難以勝任分布式系統(tǒng)開發(fā)的工作。

這篇文章是一系列文章的總集篇,所以不需要讀者有多線程相關(guān)的基礎(chǔ)。文中會按照合理的順序循序漸進地介紹Java多線程編程的方方面面,由淺入深地講解多線程編程的概念、使用、原理與實現(xiàn)。在每一部分都有對相關(guān)主題的簡單介紹,再搭配上深入講解的文章鏈接,建議還不了解相關(guān)主題的讀者可以深入閱讀鏈接中的文章來進行了解。但如果文章中間的一些內(nèi)容大家已經(jīng)非常熟悉了,那么可以略讀而過,不用理會鏈接中的文章,完全可以把這部分內(nèi)容當做復(fù)習(xí)提綱來看。

接下來,我們會在這篇文章中系統(tǒng)地了解Java多線程編程知識體系,從最基礎(chǔ)的基本概念、線程的使用開始講起,一路覆蓋多線程的正確性與運行效率相關(guān)議題,幫助大家從0到入門再到熟練掌握各種多線程編程技巧。在這之后,文章會漸趨復(fù)雜,我們會深入地討論死鎖的解決、事件驅(qū)動模型、同步機制的底層實現(xiàn)、線程池源代碼解析等高級議題,幫助讀者知其然更知其所以然,再也無懼于多線程相關(guān)的問題。

多線程基礎(chǔ) 并發(fā)的概念

多線程首先是屬于一種并發(fā)手段,所以我們首先需要了解并發(fā)的基本概念。并發(fā)就是多個執(zhí)行器同時執(zhí)行不同的任務(wù),如果這些任務(wù)需要訪問同一個數(shù)據(jù),那么就會產(chǎn)生數(shù)據(jù)競爭。如果不能做好并發(fā)控制,那么數(shù)據(jù)競爭問題就有可能會導(dǎo)致程序最終的結(jié)果出現(xiàn)錯誤,也就是我們常說的數(shù)據(jù)不一致。比如賬戶A同時要扣三筆錢,那么如果三個線程同時執(zhí)行扣款操作就有可能因為三個線程都用一開始的賬戶余額減去一個值計算出三個結(jié)果并保存到賬戶余額中,從而導(dǎo)致扣減結(jié)果之間的相互覆蓋。除了多線程并發(fā)之外還有更重要的分布式并發(fā)主題,包括原子性、臨界區(qū)、互斥、補償、兜底任務(wù)等等專業(yè)術(shù)語,這些都可以在這篇不糾結(jié)于具體技術(shù)細節(jié)、只通過生活中的例子來講解并發(fā)概念的文章《當我們在說“并發(fā)、多線程”,說的是什么?》中找到答案。

多線程編程基礎(chǔ)

了解了并發(fā)的基本概念之后我們就可以具體地在多線程編程領(lǐng)域中來了解具體的技術(shù)了。首先我們先要了解,為什么會需要多線程?多線程到底解決的是什么問題?然后,我們就可以開始實際動手寫真正的Java多線程編程代碼了,一開始,我們會直接使用Thread類來創(chuàng)建并運行線程。馬上我們就碰到了多線程所帶來的問題,我們必須通過線程同步機制才能保證最后的輸出結(jié)果正確。

在《這一次,讓我們完全掌握Java多線程》這篇文章中,我們從多線程使用的場景開始講起,只有弄明白了多線程到底能發(fā)揮什么樣的作用我們才能真正地在實踐中使用好這門重要的技術(shù)。之后我們會使用Thread來創(chuàng)建并運行線程,然后通過最基本的sychronized關(guān)鍵字來實現(xiàn)臨界區(qū)的互斥訪問,實現(xiàn)這一系列文章中的第一個正確的Java多線程程序。

線程池的使用

但在實際的開發(fā)過程中,我們基本不會自己創(chuàng)建Thread類代表的線程然后管理它的執(zhí)行。相反,我們把任務(wù)交給一個線程池,然后讓線程池自己管理任務(wù)的調(diào)度和線程的生命周期。線程池就像一個大管家,我們只要給他設(shè)定好規(guī)則和預(yù)算,他就會自動幫我們處理各種各樣的任務(wù)。想要使用好線程池,那么你只需要看完《從0到1玩轉(zhuǎn)線程池》這篇文章就夠了!

多線程程序所面臨的問題

多線程程序相比于單線程程序面臨更多更復(fù)雜的問題,這就像掏蜂窩一樣。我們既想要蜂蜜的甘甜,但是又要時刻小心不要被蜇成了滿臉包。一般來說,多線程程序會面臨三類問題:正確性問題、效率問題、死鎖問題。

正確性問題

正確性是程序的核心,如果一個程序產(chǎn)出的結(jié)果可能是錯誤的,那么這個程序的價值必然大打折扣,甚至直接清零。我們在之前的文章中使用synchronized關(guān)鍵字處理過多線程并發(fā)中的數(shù)據(jù)競爭問題。但是在實際的開發(fā)過程中,我們還會碰到更多各式各樣的并發(fā)正確性問題。《多線程中那些看不見的陷阱》這篇文章中講到了synchronized關(guān)鍵字、ReentrantLock顯式鎖、CAS操作、volatile關(guān)鍵字等一系列的線程同步工具,相信有了這些工具的保駕護航,我們一定可以寫出大量正確的多線程程序。

效率問題

雖然我們可以利用線程同步工具箱中的十八般兵器寫出正確的多線程程序,但是如果它執(zhí)行得太慢甚至還比不上單線程程序的話那就得不償失了。所以我們不僅要“對”,還要在“對”的前提下更“快”才行。在《多線程加速指南》這篇文章中,我們可以利用CAS、ForkJoinPool、線程封閉、java.util.concurrent工具包等技術(shù)讓我們的多線程程序的速度提升10倍、100倍甚至是1000倍。

死鎖問題

死鎖問題相對來說比較特殊,因為一旦出現(xiàn)死鎖問題就會導(dǎo)致程序完全無法繼續(xù)執(zhí)行。它既不會產(chǎn)生錯誤的結(jié)果,又因為程序會完全停止所以已經(jīng)不止是運行太慢的問題了。在各式各樣的并發(fā)程序中都會遇到死鎖問題,比如數(shù)據(jù)庫、操作系統(tǒng)等等都會有這個問題。如果是我們的個人電腦,那么死機之后重啟就可以了,但是線上服務(wù)往往是不能中斷的,這就需要我們找到更多更好的解決方案來解決不同情況下的死鎖問題。相信讀完這篇文章《解決死鎖的100種方法》,你會對這個問題有更多的靈感。

多線程編程實戰(zhàn)(實現(xiàn)一個阻塞隊列)

講完了這么多多線程相關(guān)的概念、技術(shù)與技巧,我們也是時候下場練練手了。阻塞隊列不僅是多線程編程中的重要工具,而且還使用了互斥鎖、條件變量、并發(fā)優(yōu)化等等一系列重要的知識點來具體實現(xiàn),這正是我們練手的最佳素材。就讓我們跟隨《從0到1實現(xiàn)自己的阻塞隊列》的腳步,一起從0到1再到N,完成一個完整的JDK級別的阻塞隊列實現(xiàn)。

高級主題

在看過多線程的基礎(chǔ)知識、關(guān)鍵技術(shù),最后又完成了一次練手以后,我們就可以繼續(xù)深入多線程領(lǐng)域中更深奧的高級主題了。

線程池運行模型源碼解析

在之前的文章中,我們已經(jīng)掌握了線程池的使用方法,雖然線程池是一個稱職的管家,但是如果我們不了解它的脾氣就有可能在不自覺的時候越過了一些它的底線,最后被它給狠狠地甩在了地上。那么現(xiàn)在就讓我們通過《線程池運行模型源碼全解析》來剖析線程池的運行模型,從源碼角度了解線程池到底是怎么運轉(zhuǎn)的。

同步機制的底層實現(xiàn)

我們已經(jīng)使用過了這么多的線程同步機制,這些線程同步機制顯得那么的神奇,幫助我們躲開一個又一個的陷阱。那么這些這么厲害的東西到底是怎么實現(xiàn)的呢?這時候就要請出我們的幕后英雄AbstractQueuedSynchronizer(簡稱AQS)了。java.util.concurrent中的大多數(shù)線程同步類都是基于AQS實現(xiàn)的,比如常用的就有可重入互斥鎖ReentrantLock、閉鎖CountDownLatch、可重入讀寫鎖ReentrantReadWriteLock、信號量Semaphore。在《同步機制的底層實現(xiàn)》中,我們可以一探究竟,看看AQS是如何實現(xiàn)這么多風(fēng)格迥異的線程同步機制的。

總結(jié)

到這里,我們就完成了整個Java多線程知識體系之旅。在這個過程中,我們首先了解了并發(fā)的基本概念和Java多線程編程的基本方法,然后出現(xiàn)了線程池這個優(yōu)秀的管家為我們打理好了任務(wù)執(zhí)行與線程調(diào)度的所有麻煩事。之后我們系統(tǒng)地了解并解決了多線程中的三類主要問題:正確性問題、效率問題和死鎖問題。在掌握了這么多Java多線程編程的知識與技巧之后,我們就通過實現(xiàn)一個阻塞隊列來了一次大練兵,不僅能檢驗我們的多線程編程技能,同時也加深了我們對這些知識的理解。最后,我們進入了多線程知識的深水區(qū),通過JDK與Netty的成熟源代碼研究了三個更底層的高級主題:事件驅(qū)動模型、線程池運行模型、同步機制的底層實現(xiàn)。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/77884.html

相關(guān)文章

  • java篇

    摘要:多線程編程這篇文章分析了多線程的優(yōu)缺點,如何創(chuàng)建多線程,分享了線程安全和線程通信線程池等等一些知識。 中間件技術(shù)入門教程 中間件技術(shù)入門教程,本博客介紹了 ESB、MQ、JMS 的一些知識... SpringBoot 多數(shù)據(jù)源 SpringBoot 使用主從數(shù)據(jù)源 簡易的后臺管理權(quán)限設(shè)計 從零開始搭建自己權(quán)限管理框架 Docker 多步構(gòu)建更小的 Java 鏡像 Docker Jav...

    honhon 評論0 收藏0
  • 從小白程序員一路晉升為大廠高級技術(shù)專家我看過哪些書籍?(建議收藏)

    摘要:大家好,我是冰河有句話叫做投資啥都不如投資自己的回報率高。馬上就十一國慶假期了,給小伙伴們分享下,從小白程序員到大廠高級技術(shù)專家我看過哪些技術(shù)類書籍。 大家好,我是...

    sf_wangchong 評論0 收藏0
  • 前端知識點整理

    摘要:難怪超過三分之一的開發(fā)人員工作需要一些知識。但是隨著行業(yè)的飽和,初中級前端就業(yè)形勢不容樂觀。整個系列的文章大概有篇左右,從我是如何成為一個前端工程師,到各種前端框架的知識。 為什么 call 比 apply 快? 這是一個非常有意思的問題。 作者會在參數(shù)為3個(包含3)以內(nèi)時,優(yōu)先使用 call 方法進行事件的處理。而當參數(shù)過多(多余3個)時,才考慮使用 apply 方法。 這個的原因...

    Lowky 評論0 收藏0
  • 前端知識點整理

    摘要:難怪超過三分之一的開發(fā)人員工作需要一些知識。但是隨著行業(yè)的飽和,初中級前端就業(yè)形勢不容樂觀。整個系列的文章大概有篇左右,從我是如何成為一個前端工程師,到各種前端框架的知識。 為什么 call 比 apply 快? 這是一個非常有意思的問題。 作者會在參數(shù)為3個(包含3)以內(nèi)時,優(yōu)先使用 call 方法進行事件的處理。而當參數(shù)過多(多余3個)時,才考慮使用 apply 方法。 這個的原因...

    snowLu 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<