很多小夥伴問我:我在大學時候就學習了多執行緒,工作後,自己也看過不少有關多執行緒和並行程式設計的書籍和視訊,為啥真正到工作的時候,我還是不知道在專案中哪裡會用到並行程式設計。我知道有關於並行程式設計的各個知識點,但是沒辦法將這些知識點串起來,形成知識體系。冰河,你能不能推一篇文章,講講如何學習並行程式設計,如何將並行程式設計的各個知識點串成知識體系呢?今天,我們就一起來探討下有關於並行程式設計的核心知識體系。
有關更多並行程式設計的知識,小夥伴們可以到【高並行專題】進行系統學習。
高並行專題的連結地址為:http://r6d.cn/r8x4
我們先來看下並行程式設計的三大核心知識圖。
要想學好並行程式設計,首先要理解三個核心的問題:分工,同步和共同作業(《【高並行】要想學好並行程式設計,關鍵是要理解這三個核心問題》)。
並行程式設計並不像普通業務中的CRUD那麼簡單,往往在並行程式設計中會出現各種各樣詭異的Bug問題(《【高並行】導致並行程式設計頻繁出問題的「幕後黑手」》),而且這些問題也不好復現。究其根本原因,是作業系統的CPU與記憶體和I/O存在速度差異,而作業系統和編譯器在解決這些速度差異帶來的問題時,又引入了可見性(《【高並行】解密導致詭異並行問題的第一個幕後黑手——可見性問題》)、原子性(《【高並行】解密導致並行問題的第二個幕後黑手——原子性問題》)、有序性(《【高並行】解密導致並行問題的第三個幕後黑手——有序性問題》)問題,而這三個核心問題,就是導致並行程式設計出現各種詭異Bug的根本所在。
在Java中,如何解決並行程式設計中的可見性、原子性和有序性問題呢?在Java中提供了記憶體模型和互斥鎖的方案來解決這些問題。在Java的記憶體模型中,有一個很重要的原則,那就是:Happens-Before原則(《何為Happens-Before原則?這次徹底懂了!》)。通過Java的記憶體模型,能夠解決可見性和有序性問題(《【高並行】如何解決可見性和有序性問題?這次徹底懂了!》),對於如何解決原子性問題,我們使用的是互斥鎖方案(《【高並行】如何使用互斥鎖解決多執行緒的原子性問題?這次終於明白了!》)。
互斥鎖在是解決並行問題的核心方案,但是一不留神就會引起死鎖(《【高並行】高並行環境下詭異的加鎖問題(你加的鎖未必安全)》、《【高並行】優化加鎖方式時竟然死鎖了!!》)
既然互斥鎖會帶來死鎖的問題,那我們如何優化加鎖的方式呢?(《【高並行】高並行場景下如何優化加鎖方式?看完這篇我確實明白了!!》)
執行緒的生命週期(《【高並行】執行緒的生命週期其實沒有我們想象的那麼簡單!!》)、高並行場景下我們到底建立多少執行緒合適(《【高並行】高並行場景下建立多少執行緒才合適?一條公式幫你搞定!!》)?為什麼區域性變數就是執行緒安全的(《【高並行】終於弄懂為什麼區域性變數是執行緒安全的了!!》)?為什麼很多小夥伴面試會栽在InterruptedException上(《【高並行】由InterruptedException異常引發的思考》)?我可以用Java中的物件導向的思想寫好並行程式,你信嗎(《【高並行】信不信?以物件導向的思想是可以寫好高並行程式的!》)?
秒殺系統架構解密(《【高並行】高並行秒殺系統架構解密,不是所有的秒殺都是秒殺!》)
分散式鎖架構解密(《【高並行】高並行分散式鎖架構解密,不是所有的鎖都是分散式鎖!!》)
分散式限流理論(《【高並行】如何實現億級流量下的分散式限流?這些理論你必須掌握!!》)
分散式限流演演算法(《【高並行】如何實現億級流量下的分散式限流?這些演演算法你必須掌握!!》)
實現HTTP介面限流(《【高並行】億級流量場景下如何為HTTP介面限流?看完我懂了!!》)
實現分散式限流(《【高並行】億級流量場景下如何實現分散式限流?看完我徹底懂了!!》)
有關更多並行程式設計的知識,小夥伴們可以到【高並行專題】進行系統學習。
高並行專題的連結地址為:http://r6d.cn/r8x4
好了,今天就到這兒吧,我是冰河,我們下期見!