Java初學有必要深入多線程編程嗎?如何學習?
要說多線程,先來說說多線程的優(yōu)點,那些不可不說的美妙的故事:
(1)進程間不能共享內存,但線程之間可以共享內存非常容易;
(2)系統創(chuàng)建進程需要為該進程重新分配系統資源,但創(chuàng)建線程則代價小的多,因此使用多線程來實現多任務并發(fā)比多進程的效率高;
(3)Java語言內置多線程功能支持,而不是單純地作為底層操作系統的調度方式,從而簡化了Java的多線程編程。

再來說說多線程的那些坑,真是坑死人不償命的那種,使用起來特別爽,出現的問題往往讓人摸不著頭腦,可真所謂相愛相殺。多線程環(huán)境下的一些問題:安全性問題,在沒有正確同步的情況下,多線程環(huán)境下程序可能得出錯誤的結果;活躍性問題,在多線程環(huán)境下,當某個操作應該繼續(xù)執(zhí)行卻無法繼續(xù)執(zhí)行下去,就造成了活躍性問題,如:死鎖,饑餓,活鎖;性能問題,線程的頻繁切換將帶來極大的開銷,如:保存和恢復執(zhí)行上下文,丟失局部性。使用同步機制的時候,這些機制會抑制某些編譯器優(yōu)化以保證執(zhí)行順序,如使用volatile保證可見性的情況下,使內存緩沖區(qū)中的數據無效,其他線程需要重新從主內存中加載。所有這些因素會帶來額外的性能開銷。

再來說說學習的步驟,個人也打算按照這一步驟來走,具體沒有實踐過,且行且珍惜。關注大師的言行,跟隨大師的舉動——JUC包已經足夠豐富,按照API規(guī)范正確使用。和大師一起修行——理解多線程問題的由來,以及JVM給出的解決方案,需要理解java的內存模型JMM,以及JMM給出的線程工作內存與主內存交互的規(guī)則如何形成JMM的happens-before原則等。參考書有知名的《深入理解Java虛擬機》第12章,最重要的《JSR-133 Java內存模型與線程規(guī)范》以及《并發(fā)編程實戰(zhàn)》第16章。領悟大師的意境——JUC包的實現原理,volatile和CAS構筑了JUC包的基礎類,AQS,非阻塞數據結構,原子變量,這些基礎類又構建了JUC包的高層類,Lock,同步器,阻塞隊列,并發(fā)容器,Executor等。理解了高層類的原理,能夠心里有底地使用這些類,構建健壯的應用。成為真正的大師——學習JUC包的實現,說不定哪天也能寫出一樣優(yōu)秀的類。



