并發(fā)編程是現(xiàn)代計算機(jī)軟件最常見的編程模式,是操作系統(tǒng)到應(yīng)用軟件到分布式系統(tǒng)都要關(guān)心的問題,其核 心目標(biāo)是解決并行事件的資源共享和訪問問題。
自從學(xué)生時代,我就一直在學(xué)習(xí)和并試圖理解這些概念。尤 其是在學(xué)操作系統(tǒng)時,曾經(jīng)想得覺得自己腦殼都要爆炸了。許多東西是要隨著知識和實(shí)際工作經(jīng)驗(yàn)的增長 才能領(lǐng)悟的,F(xiàn)在的我覺得現(xiàn)在對這些概念的理解已經(jīng)超出當(dāng)初的理解水平,雖然許多更深入的概念和細(xì)節(jié)我現(xiàn)在都還是很糊涂,但為了梳理這些知識,防止遺忘, 在這兒把我對這些東西的理解,以及它們在Java中的應(yīng)用講出來?上КF(xiàn)在操作系統(tǒng)的書已經(jīng)很長時間不看了,肯定有許多不對的地方,如果您覺得不對,希望 您能及時指出。
一切都要從這個世界的并行性講開。事物的發(fā)展總是并行進(jìn)行的,汽車在奔馳的同時,自行車也在行駛;別人正在唱歌,你可能正在吃飯;等等。這些都是并行的例 子,就單個事物來看,它發(fā)展的動作一般是順序進(jìn)行,而多個事物之間一般誰也不會妨礙誰,除非它們的動作要作用在同一個對象上:汽車過十字路口的綠燈時,另 一個方向的汽車就不能行駛;如果你在食堂里舉辦歌舞晚會,別人就不能在這兒吃飯。
計算機(jī)軟件的基本模型是順序執(zhí)行的,然而現(xiàn)代計算機(jī)在此基礎(chǔ)上發(fā)展出了并發(fā)概念。什么是并發(fā)?什么是并行?它們之間的區(qū)別是什么?并發(fā)與并行是兩個既相似 而又不相同的概念:并發(fā)性,又稱共行性,是指能處理多個同時性活動的能力;并行是指同時發(fā)生的兩個并發(fā)事件,具有并發(fā)的含義,而并發(fā)則不一定并行,也亦是 說并發(fā)事件之間不一定要同一時刻發(fā)生。并行一般是指沒有互斥和同步的情況下獨(dú)立進(jìn)行同時發(fā)生的事件。因此單CPU操作系統(tǒng)的進(jìn)程/線程嚴(yán)格意義上來說都不 能算是并行事件,畢竟它們都要使用同一個CPU,真正的并行出現(xiàn)在多處理器的計算機(jī)上,當(dāng)進(jìn)程/線程獨(dú)立運(yùn)行在不同的CPU上,而且沒有不需要共享對象 時。粗略的說,沒有資源互斥共享的進(jìn)程和線程都是并行的。
填寫下面表單即可預(yù)約申請免費(fèi)試聽java課程!害怕學(xué)不會?助教陪讀,隨時解惑!擔(dān)心就業(yè)?一地學(xué)習(xí),可全國推薦就業(yè)!
如果進(jìn)程/線程沒有共享任何數(shù)據(jù),它們編程所關(guān)心的許多概念就不會存在。就像現(xiàn)實(shí)世界,如果任何兩個人都是獨(dú)立的,沒有任何關(guān)系的,那么也不會存在社會的 各種機(jī)構(gòu)來協(xié)調(diào)這些關(guān)系。在操作系統(tǒng)中,進(jìn)程之間共享數(shù)據(jù)的方式一般通過IO(如:文件、管道、網(wǎng)絡(luò)端口等等),當(dāng)然也有時會通過內(nèi)存共享。這種松耦合的 共享造成的同步、互斥問題并不多。常見的同步問題發(fā)生同一進(jìn)程內(nèi)不同線程之間。由于線程存在于同個進(jìn)程中,它們之間是可以共享內(nèi)存的,所以就會有很多同步 和互斥的問題。
那么什么是同步,什么是互斥?同步和互斥往往是共生的。所謂的同步是指不同實(shí)體的動作按照某些特定條件的順序執(zhí)行。最常見的莫過于生產(chǎn)者和消費(fèi)者之間的關(guān) 系。生產(chǎn)者的生產(chǎn)動作和消費(fèi)者的消費(fèi)動作是必須滿足先后順序的:只有生產(chǎn)者生產(chǎn)出東西來,消費(fèi)者才能消費(fèi)這些東西。它們之間就需要所謂的同步。什么是互 斥?互斥是指兩個實(shí)體的動作不允許同時發(fā)生,如果同時發(fā)生就會產(chǎn)生不可以預(yù)期的結(jié)果;コ馐峭降那疤幔绻麅蓚動作不是互斥的,就不可能保證其發(fā)生的順 序。同步一定是互斥的,而互斥不一定需要同步。同步是固定順序的動作的互斥。理解這一點(diǎn)非常重要。
舉個我們都熟悉的例子,多個并發(fā)生產(chǎn)者和多個并發(fā)消費(fèi)者。生產(chǎn)者生產(chǎn)的對象放在一個數(shù)組中,而消費(fèi)者則從這個數(shù)組中獲取對象。那么生產(chǎn)者的生產(chǎn)動作之間是 需要互斥的,但不需要同步。不管是A先放在數(shù)組,還是B先放在數(shù)組中,它們之間除了為避免將產(chǎn)品放在數(shù)組中同一位置上,需要互斥地訪問數(shù)組外,是不需要規(guī) 定哪一個在前面放,哪一個在后面放的。它們之間的關(guān)系就屬于互斥。而生產(chǎn)者和消費(fèi)者之間就存在一個先后順序問題,必須至少有生產(chǎn)者生產(chǎn)出產(chǎn)品放在數(shù)組中, 消費(fèi)者才能開始消費(fèi)。因此生產(chǎn)者生產(chǎn)和消費(fèi)者消費(fèi)之間的就是同步關(guān)系。此外,消費(fèi)者和消費(fèi)者之間的消費(fèi)關(guān)系也是需要互斥的,這樣才能避免兩個消費(fèi)者之間爭 奪同數(shù)組里同一位置的對象。但是它們的消費(fèi)行為是不需要同步的,只要互斥的進(jìn)行就行了。
因此不同實(shí)體之間的動作有兩個基本關(guān)系:同步和互斥。一般處理同步的方法是建立在互斥的基礎(chǔ)上的;コ獾臋C(jī)制一般需要通過操作系統(tǒng)甚至底層硬件提供的信號 量、管程(管程是建立在信號量基礎(chǔ)上的更高層構(gòu)件)等底層機(jī)制來實(shí)現(xiàn)。Java語言中通過提供互斥原語synchronized(雖然叫同步,更準(zhǔn)確的說 應(yīng)該是互斥mutex)來保證的,當(dāng)然Java實(shí) 際上是通過JVM的monitor_enter和monitor_exit指令來實(shí)現(xiàn)的,這些指令最終以底層操作系統(tǒng)提供的機(jī)制來實(shí)現(xiàn)。同步的實(shí)現(xiàn)除了要 依靠互斥原語,還要結(jié)合條件判斷和線程掛起等語言構(gòu)件來實(shí)現(xiàn)。其原理比較簡單,首先要通過原語synchronized互斥兩個需要同步的動作(也稱作臨 界代碼),當(dāng)某個動作(比如消費(fèi))獲得信號鎖進(jìn)入管程時,它首先判斷某個條件是否滿足(是否有可消費(fèi)對象),不滿足則掛起當(dāng)前線程,釋放信號鎖,允許其他 線程進(jìn)入。當(dāng)其他線程(比如生產(chǎn)者)進(jìn)入后,也是檢查是否滿足某些條件(比如數(shù)組是否有空閑),如果不滿足則和前面線程一樣釋放信號鎖并掛起線程,如果滿 足(有空閑)則進(jìn)行動作(生產(chǎn)并放在數(shù)組空閑處),然后這個動作一般要負(fù)責(zé)激活其他掛起的線程(當(dāng)然也可以不負(fù)責(zé)任,其結(jié)果是往往造成死鎖),然后自己釋 放信號鎖退出管程。其他被激活的線程進(jìn)入下一輪競爭,誰獲得信號鎖后繼續(xù)檢查它需要的條件是否滿足,如此繼續(xù)下去。
如果你現(xiàn)在想學(xué)習(xí)Java,贏取高薪工作機(jī)會,非常簡單,填寫下面信息,學(xué)好Java技術(shù)高薪工作機(jī)會唾手可得。
上一篇:JavaFloat類的構(gòu)造方法,你都清楚多少呢?
下一篇: 沒有了
初級會計職稱中級會計職稱經(jīng)濟(jì)師注冊會計師證券從業(yè)銀行從業(yè)會計實(shí)操統(tǒng)計師審計師高級會計師基金從業(yè)資格稅務(wù)師資產(chǎn)評估師國際內(nèi)審師ACCA/CAT價格鑒證師統(tǒng)計資格從業(yè)
一級建造師二級建造師消防工程師造價工程師土建職稱房地產(chǎn)經(jīng)紀(jì)人公路檢測工程師建筑八大員注冊建筑師二級造價師監(jiān)理工程師咨詢工程師房地產(chǎn)估價師 城鄉(xiāng)規(guī)劃師結(jié)構(gòu)工程師巖土工程師安全工程師設(shè)備監(jiān)理師環(huán)境影響評價土地登記代理公路造價師公路監(jiān)理師化工工程師暖通工程師給排水工程師計量工程師
人力資源考試教師資格考試出版專業(yè)資格健康管理師導(dǎo)游考試社會工作者司法考試職稱計算機(jī)營養(yǎng)師心理咨詢師育嬰師事業(yè)單位教師招聘公務(wù)員公選考試招警考試選調(diào)生村官
執(zhí)業(yè)藥師執(zhí)業(yè)醫(yī)師衛(wèi)生資格考試衛(wèi)生高級職稱護(hù)士資格證初級護(hù)師主管護(hù)師住院醫(yī)師臨床執(zhí)業(yè)醫(yī)師臨床助理醫(yī)師中醫(yī)執(zhí)業(yè)醫(yī)師中醫(yī)助理醫(yī)師中西醫(yī)醫(yī)師中西醫(yī)助理口腔執(zhí)業(yè)醫(yī)師口腔助理醫(yī)師公共衛(wèi)生醫(yī)師公衛(wèi)助理醫(yī)師實(shí)踐技能內(nèi)科主治醫(yī)師外科主治醫(yī)師中醫(yī)內(nèi)科主治兒科主治醫(yī)師婦產(chǎn)科醫(yī)師西藥士/師中藥士/師臨床檢驗(yàn)技師臨床醫(yī)學(xué)理論中醫(yī)理論