要說多線程,先來說說多線程的優(yōu)點(diǎn),那些不可不說的美妙的故事:
(1)進(jìn)程間不能共享內(nèi)存,但線程之間可以共享內(nèi)存非常容易;
(2)系統(tǒng)創(chuàng)建進(jìn)程需要為該進(jìn)程重新分配系統(tǒng)資源,但創(chuàng)建線程則代價(jià)小的多,因此使用多線程來實(shí)現(xiàn)多任務(wù)并發(fā)比多進(jìn)程的效率高;
(3)Java語(yǔ)言內(nèi)置多線程功能支持,而不是單純地作為底層操作系統(tǒng)的調(diào)度方式,從而簡(jiǎn)化了Java的多線程編程。

Java初學(xué)

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

Java初學(xué)

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

Java初學(xué)

夢(mèng)想還是要有的呢,萬一實(shí)現(xiàn)了呢?雖然實(shí)現(xiàn)的可能性不大,但是作為一只有理想的猿,還是要有點(diǎn)兒追求,而這點(diǎn)兒追求,多線程或許就是必須邁過的坎。
Java初學(xué)