国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

多線程編程完全指南

mengera88 / 1964人閱讀

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

多線程編程或者說范圍更大的并發編程是一種非常復雜且容易出錯的編程方式,但是我們為什么還要冒著風險艱辛地學習各種多線程編程技術、解決各種并發問題呢?

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

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

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

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

多線程基礎 并發的概念

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

多線程編程基礎

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

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

線程池的使用

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

多線程程序所面臨的問題

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

正確性問題

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

效率問題

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

死鎖問題

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

多線程編程實戰(實現一個阻塞隊列)

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

高級主題

在看過多線程的基礎知識、關鍵技術,最后又完成了一次練手以后,我們就可以繼續深入多線程領域中更深奧的高級主題了。

線程池運行模型源碼解析

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

同步機制的底層實現

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

總結

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/77884.html

相關文章

  • java篇

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

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

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

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

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

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

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

    snowLu 評論0 收藏0

發表評論

0條評論

mengera88

|高級講師

TA的文章

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