轉(zhuǎn)帖|其它|編輯:郝浩|2010-05-11 13:43:48.000|閱讀 740 次
概述:我們?cè)诠蚕砦覀兊臄?shù)據(jù)的時(shí)候必須要考慮到安全的問題。Java線程同步鎖就幫助我們解決了這個(gè)難纏的問題。下面我們就來學(xué)些有關(guān)這方面的問題,希望大家有收獲。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
我們?cè)诠蚕砦覀兊?數(shù)據(jù)的時(shí)候必須要考慮到安全的問題。Java線程同步鎖就幫助我們解決了這個(gè)難纏的問題。下面我們就來學(xué)些有關(guān)著房門的問題,希望大家有所后收獲。
我們可以在計(jì)算機(jī)上運(yùn)行各種計(jì)算機(jī)軟件程序。每一個(gè)運(yùn)行的程序可能包括多個(gè)獨(dú)立運(yùn)行的線程(Thread)。線程(Thread)是一份獨(dú)立運(yùn)行的程序,有自己專用的運(yùn)行棧。線程有可能和其他線程共享一些資源,比如,內(nèi)存,文件,數(shù)據(jù)庫(kù)等。
當(dāng)多個(gè)Java線程同步鎖同時(shí)讀寫同一份共享資源的時(shí)候,可能會(huì)引起沖突。這時(shí)候,我們需要引入線程“同步”機(jī)制,即各位線程之間要有個(gè)先來后到,不能一窩蜂擠上去搶作一團(tuán)。
同步這個(gè)詞是從英文synchronize(使同時(shí)發(fā)生)翻譯過來的。我也不明白為什么要用這個(gè)很容易引起誤解的詞。既然大家都這么用,咱們也就只好這么將就。 Java線程同步鎖的真實(shí)意思和字面意思恰好相反。線程同步的真實(shí)意思,其實(shí)是“排隊(duì)”:幾個(gè)線程之間要排隊(duì),一個(gè)一個(gè)對(duì)共享資源進(jìn)行操作,而不是同時(shí)進(jìn)行操作。
因此,關(guān)于線程同步,需要牢牢記住的第一點(diǎn)是:線程同步就是線程排隊(duì)。同步就是排隊(duì)。線程同步的目的就是避免線程“同步”執(zhí)行。這可真是個(gè)無聊的繞口令。
關(guān)于線程同步,需要牢牢記住的第二點(diǎn)是 “共享”這兩個(gè)字。只有共享資源的讀寫訪問才需要同步。如果不是共享資源,那么就根本沒有同步的必要。
關(guān)于線程同步,需要牢牢記住的第三點(diǎn)是,只有“變量”才需要同步訪問。如果共享的資源是固定不變的,那么就相當(dāng)于“常量”,線程同時(shí)讀取常量也不需要同步。至少一個(gè)Java線程同步鎖修改共享資源,這樣的情況下,線程之間就需要同步。
關(guān)于線程同步,需要牢牢記住的第四點(diǎn)是:多個(gè)線程訪問共享資源的代碼有可能是同一份代碼,也有可能是不同的代碼;無論是否執(zhí)行同一份代碼,只要這些線程的代碼訪問同一份可變的共享資源,這些線程之間就需要同步。
為了加深理解,下面舉幾個(gè)例子。
有兩個(gè)采購(gòu)員,他們的工作內(nèi)容是相同的,都是遵循如下的步驟:
(1)到市場(chǎng)上去,尋找并購(gòu)買有潛力的樣品。
(2)回到公司,寫報(bào)告。
這兩個(gè)人的工作內(nèi)容雖然一樣,他們都需要購(gòu)買樣品,他們可能買到同樣種類的樣品,但是他們絕對(duì)不會(huì)購(gòu)買到同一件樣品,他們之間沒有任何共享資源。所以,他們可以各自進(jìn)行自己的工作,互不干擾。
這兩個(gè)采購(gòu)員就相當(dāng)于兩個(gè)Java線程同步鎖;兩個(gè)采購(gòu)員遵循相同的工作步驟,相當(dāng)于這兩個(gè)線程執(zhí)行同一段代碼。
下面給這兩個(gè)采購(gòu)員增加一個(gè)工作步驟。采購(gòu)員需要根據(jù)公司的“布告欄”上面公布的信息,安排自己的工作計(jì)劃。
這兩個(gè)采購(gòu)員有可能同時(shí)走到布告欄的前面,同時(shí)觀看布告欄上的信息。這一點(diǎn)問題都沒有。因?yàn)椴几鏅谑侵蛔x的,這兩個(gè)采購(gòu)員誰(shuí)都不會(huì)去修改布告欄上寫的信息。
下面增加一個(gè)角色。一個(gè)辦公室行政人員這個(gè)時(shí)候,也走到了布告欄前面,準(zhǔn)備修改布告欄上的信息。
如果行政人員先到達(dá)布告欄,并且正在修改布告欄的內(nèi)容。兩個(gè)采購(gòu)員這個(gè)時(shí)候,恰好也到了。這兩個(gè)采購(gòu)員就必須等待行政人員完成修改之后,才能觀看修改后的信息。
如果行政人員到達(dá)的時(shí)候,兩個(gè)采購(gòu)員已經(jīng)在觀看布告欄了。那么行政人員需要等待兩個(gè)采購(gòu)員把當(dāng)前信息記錄下來之后,才能夠?qū)懮闲碌男畔ⅰ?/p>
上述這兩種情況,行政人員和采購(gòu)員對(duì)布告欄的訪問就需要進(jìn)行同步。因?yàn)槠渲幸粋€(gè)線程(行政人員)修改了共享資源(布告欄)。而且我們可以看到,行政人員的工作流程和采購(gòu)員的工作流程(執(zhí)行代碼)完全不同,但是由于他們?cè)L問了同一份可變共享資源(布告欄),所以他們之間需要同步。
Java線程同步鎖
前面講了為什么要Java線程同步鎖同步,下面我們就來看如何才能線程同步。
線程同步的基本實(shí)現(xiàn)思路還是比較容易理解的。我們可以給共享資源加一把鎖,這把鎖只有一把鑰匙。哪個(gè)線程獲取了這把鑰匙,才有權(quán)利訪問該共享資源。
生活中,我們也可能會(huì)遇到這樣的例子。一些超市的外面提供了一些自動(dòng)儲(chǔ)物箱。每個(gè)儲(chǔ)物箱都有一把鎖,一把鑰匙。人們可以使用那些帶有鑰匙的儲(chǔ)物箱,把東西放到儲(chǔ)物箱里面,把儲(chǔ)物箱鎖上,然后把鑰匙拿走。這樣,該儲(chǔ)物箱就被鎖住了,其他人不能再訪問這個(gè)儲(chǔ)物箱。(當(dāng)然,真實(shí)的儲(chǔ)物箱鑰匙是可以被人拿走復(fù)制的,所以不要把貴重物品放在超市的儲(chǔ)物箱里面。于是很多超市都采用了電子密碼鎖。)
Java線程同步鎖這個(gè)模型看起來很直觀。但是,還有一個(gè)嚴(yán)峻的問題沒有解決,這個(gè)同步鎖應(yīng)該加在哪里?
當(dāng)然是加在共享資源上了。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載