? ? ? ? ? 本系列譯自jakob jenkov的Java并發(fā)多線程教程十饥,個(gè)人覺(jué)得很有收獲尿瞭。由于個(gè)人水平有限,不對(duì)之處還望矯正每界!
? ? ? ? 在早期,計(jì)算機(jī)只有一個(gè)CPU,同一時(shí)刻只能執(zhí)行一個(gè)程序家卖,后來(lái)有了多任務(wù)的說(shuō)法眨层,多任務(wù)是指計(jì)算機(jī)在同一時(shí)刻可以執(zhí)行多個(gè)程序,但這并不是真正意義上的同一時(shí)刻上荡,單個(gè)CPU 被多個(gè)程序共用趴樱,操作系統(tǒng)會(huì)在運(yùn)行的運(yùn)行的程序間相互切換。在相互切換之前會(huì)短暫的執(zhí)行其中的一個(gè)。
? ? ? 隨著多任務(wù)的產(chǎn)生叁征,給程序開(kāi)發(fā)人員帶來(lái)了新的挑戰(zhàn)纳账。程序不能再假定擁有所有的CPU 時(shí)間,不能再假定它擁有所有的內(nèi)存空間和計(jì)算機(jī)的其他資源航揉。一段好的程序應(yīng)該釋放掉不再使用的資源塞祈,以至于其他程序能夠使用這些資源。再此之后又出現(xiàn)了多線程帅涂,這意味著在同一程序中可以有多個(gè)線程執(zhí)行,一個(gè)線程的執(zhí)行可以認(rèn)為一個(gè)CPU在執(zhí)行這段程序尤蛮,當(dāng)有多個(gè)線程執(zhí)行時(shí)可被視作多個(gè)CPU 在執(zhí)行這個(gè)程序媳友。
? ? ? 多線程被視作可以提升程序性能的一種很好的方式,但是相對(duì)于多任務(wù)产捞,多線程帶來(lái)了更多的挑戰(zhàn)醇锚。同一個(gè)程序內(nèi)部多個(gè)線程同一時(shí)刻執(zhí)行,這就意味著他們同時(shí)讀寫(xiě)內(nèi)存坯临,這樣就會(huì)出現(xiàn)在單線程下不會(huì)產(chǎn)生的錯(cuò)誤焊唬,而這些錯(cuò)誤不會(huì)出現(xiàn)在單CPU 的計(jì)算機(jī)上,因?yàn)樵趩蜟PU 的計(jì)算機(jī)上看靠,同一時(shí)刻赶促,多個(gè)線程并不是真的都在執(zhí)行,現(xiàn)代計(jì)算機(jī)有多核挟炬,甚至于有些計(jì)算機(jī)擁有多CPU,這就意味著不同的線程可以同時(shí)被不同的核或是不同的CPU 執(zhí)行鸥滨。
如果一個(gè)線程從內(nèi)存區(qū)域讀一個(gè)值的時(shí)候,另一個(gè)線程正在向內(nèi)存區(qū)域?qū)戇@個(gè)值的時(shí)候谤祖,那么讀的線程最終會(huì)讀到什么結(jié)果呢婿滓?原來(lái)的值?還是被另一個(gè)線程修改后的值呢粥喜?如果沒(méi)有合適的保證措施凸主,這些值都是有可能讀到的。這種行為不可預(yù)知额湘,結(jié)果可能隨時(shí)都在變卿吐。因此,作為一個(gè)程序員缩挑,對(duì)正確對(duì)結(jié)果的預(yù)測(cè)是非常重要的但两!這就意味著程序員要學(xué)會(huì)怎么去控制線程對(duì)諸如內(nèi)存、文件供置、數(shù)據(jù)庫(kù)等這些共享資源的訪問(wèn)谨湘。
Java中的多線程和并發(fā)
? Java 是讓程序員很容易實(shí)現(xiàn)多線程的語(yǔ)言之一。java 自從開(kāi)始之初就有多線程的能力,因此java 開(kāi)發(fā)人員經(jīng)常面對(duì)上面所說(shuō)的問(wèn)題紧阔。