Java線程同步鎖解決共享數(shù)據(jù)安全
我們在共享我們的數(shù)據(jù)的時候必須要考慮到安全的問題。Java線程同步鎖就幫助我們解決了這個難纏的問題。下面我們就來學(xué)些有關(guān)著房門的問題,希望大家有所后收獲。
我們可以在計算機(jī)上運(yùn)行各種計算機(jī)軟件程序。每一個運(yùn)行的程序可能包括多個獨立運(yùn)行的線程(Thread)。線程(Thread)是一份獨立運(yùn)行的程序,有自己專用的運(yùn)行棧。線程有可能和其他線程共享一些資源,比如,內(nèi)存,文件,數(shù)據(jù)庫等。
當(dāng)多個Java線程同步鎖同時讀寫同一份共享資源的時候,可能會引起沖突。這時候,我們需要引入線程“同步”機(jī)制,即各位線程之間要有個先來后到,不能一窩蜂擠上去搶作一團(tuán)。
同步這個詞是從英文synchronize(使同時發(fā)生)翻譯過來的。我也不明白為什么要用這個很容易引起誤解的詞。既然大家都這么用,咱們也就只好這么將就。 Java線程同步鎖的真實意思和字面意思恰好相反。線程同步的真實意思,其實是“排隊”:幾個線程之間要排隊,一個一個對共享資源進(jìn)行操作,而不是同時進(jìn)行操作。
因此,關(guān)于線程同步,需要牢牢記住的第一點是:線程同步就是線程排隊。同步就是排隊。線程同步的目的就是避免線程“同步”執(zhí)行。這可真是個無聊的繞口令。
關(guān)于線程同步,需要牢牢記住的第二點是 “共享”這兩個字。只有共享資源的讀寫訪問才需要同步。如果不是共享資源,那么就根本沒有同步的必要。#t#
關(guān)于線程同步,需要牢牢記住的第三點是,只有“變量”才需要同步訪問。如果共享的資源是固定不變的,那么就相當(dāng)于“常量”,線程同時讀取常量也不需要同步。至少一個Java線程同步鎖修改共享資源,這樣的情況下,線程之間就需要同步。
關(guān)于線程同步,需要牢牢記住的第四點是:多個線程訪問共享資源的代碼有可能是同一份代碼,也有可能是不同的代碼;無論是否執(zhí)行同一份代碼,只要這些線程的代碼訪問同一份可變的共享資源,這些線程之間就需要同步。
為了加深理解,下面舉幾個例子。
有兩個采購員,他們的工作內(nèi)容是相同的,都是遵循如下的步驟:
(1)到市場上去,尋找并購買有潛力的樣品。
(2)回到公司,寫報告。
這兩個人的工作內(nèi)容雖然一樣,他們都需要購買樣品,他們可能買到同樣種類的樣品,但是他們絕對不會購買到同一件樣品,他們之間沒有任何共享資源。所以,他們可以各自進(jìn)行自己的工作,互不干擾。
這兩個采購員就相當(dāng)于兩個Java線程同步鎖;兩個采購員遵循相同的工作步驟,相當(dāng)于這兩個線程執(zhí)行同一段代碼。
下面給這兩個采購員增加一個工作步驟。采購員需要根據(jù)公司的“布告欄”上面公布的信息,安排自己的工作計劃。
這兩個采購員有可能同時走到布告欄的前面,同時觀看布告欄上的信息。這一點問題都沒有。因為布告欄是只讀的,這兩個采購員誰都不會去修改布告欄上寫的信息。
下面增加一個角色。一個辦公室行政人員這個時候,也走到了布告欄前面,準(zhǔn)備修改布告欄上的信息。
如果行政人員先到達(dá)布告欄,并且正在修改布告欄的內(nèi)容。兩個采購員這個時候,恰好也到了。這兩個采購員就必須等待行政人員完成修改之后,才能觀看修改后的信息。
如果行政人員到達(dá)的時候,兩個采購員已經(jīng)在觀看布告欄了。那么行政人員需要等待兩個采購員把當(dāng)前信息記錄下來之后,才能夠?qū)懮闲碌男畔ⅰ?/p>
上述這兩種情況,行政人員和采購員對布告欄的訪問就需要進(jìn)行同步。因為其中一個線程(行政人員)修改了共享資源(布告欄)。而且我們可以看到,行政人員的工作流程和采購員的工作流程(執(zhí)行代碼)完全不同,但是由于他們訪問了同一份可變共享資源(布告欄),所以他們之間需要同步。
Java線程同步鎖
前面講了為什么要Java線程同步鎖同步,下面我們就來看如何才能線程同步。
線程同步的基本實現(xiàn)思路還是比較容易理解的。我們可以給共享資源加一把鎖,這把鎖只有一把鑰匙。哪個線程獲取了這把鑰匙,才有權(quán)利訪問該共享資源。
生活中,我們也可能會遇到這樣的例子。一些超市的外面提供了一些自動儲物箱。每個儲物箱都有一把鎖,一把鑰匙。人們可以使用那些帶有鑰匙的儲物箱,把東西放到儲物箱里面,把儲物箱鎖上,然后把鑰匙拿走。這樣,該儲物箱就被鎖住了,其他人不能再訪問這個儲物箱。(當(dāng)然,真實的儲物箱鑰匙是可以被人拿走復(fù)制的,所以不要把貴重物品放在超市的儲物箱里面。于是很多超市都采用了電子密碼鎖。)
Java線程同步鎖這個模型看起來很直觀。但是,還有一個嚴(yán)峻的問題沒有解決,這個同步鎖應(yīng)該加在哪里?
當(dāng)然是加在共享資源上了。反應(yīng)快的讀者一定會搶先回答。