public Object getObject(String key,Object o) {

創(chuàng)新互聯(lián)主要從事成都網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)淅川,十年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18982081108
synchronized (map) {
if(map.get(key)==null) {
map.put(key,o)
}else {
return map.get(key);
}}// 格式?jīng)]法弄,自己弄一下
}
// demol0326 的回答意思使用MyTest的實(shí)例來加鎖,但是map是static的,無法鎖住
// MyTest的多個(gè)實(shí)例在多個(gè)線程中的請(qǐng)求
//禾木雙子 :如果A線程在getObject方法的第二行停止,此時(shí)B線程進(jìn)入getObject后執(zhí)行部分代碼, 此時(shí)B線程停止,A線程啟動(dòng),他不會(huì)執(zhí)行'多線程處理', 仍然有線程線程安全問題,(想像一下更多的線程進(jìn)入該方法的情況,num甚至?xí)玫截?fù)值)
能。java代碼右下角加鎖能運(yùn)行,是因?yàn)槎嗑€程共享的代碼區(qū)域需要上鎖,防止多線程同時(shí)訪問代碼塊,造成線程安全問題。
Synchronize是修飾符,用synchronize修飾表示這個(gè)類或方法為同步的,在運(yùn)行過程中會(huì)上同步鎖。
synchronized 方法:通過在方法聲明中加入 synchronized關(guān)鍵字來聲明 synchronized 方法。如:
public synchronized void accessVal(int newVal);
synchronized 方法控制對(duì)類成員變量的訪問:每個(gè)類實(shí)例對(duì)應(yīng)一把鎖,每個(gè) synchronized 方法都必須獲得調(diào)用該方法的類實(shí)例的鎖方能執(zhí)行,否則所屬線程阻塞,方法一旦執(zhí)行,就獨(dú)占該鎖,直到從該方法返回時(shí)才將鎖釋放,此后被阻塞的線程方能獲得 該鎖,重新進(jìn)入可執(zhí)行狀態(tài)。這種機(jī)制確保了同一時(shí)刻對(duì)于每一個(gè)類實(shí)例,其所有聲明為 synchronized 的成員函數(shù)中至多只有一個(gè)處于可執(zhí)行狀態(tài)(因?yàn)橹炼嘀挥幸粋€(gè)能夠獲得該類實(shí)例對(duì)應(yīng)的鎖),從而有效避免了類成員變量的訪問沖突(只要所有可能訪問類成員變 量的方法均被聲明為 synchronized)。
在 Java 中,不光是類實(shí)例,每一個(gè)類也對(duì)應(yīng)一把鎖,這樣我們也可將類的靜態(tài)成員函數(shù)聲明為 synchronized ,以控制其對(duì)類的靜態(tài)成員變量的訪問。
synchronized 方法的缺陷:若將一個(gè)大的方法聲明為synchronized 將會(huì)大大影響效率,典型地,若將線程類的方法 run() 聲明為 synchronized ,由于在線程的整個(gè)生命期內(nèi)它一直在運(yùn)行,因此將導(dǎo)致它對(duì)本類任何 synchronized 方法的調(diào)用都永遠(yuǎn)不會(huì)成功。當(dāng)然我們可以通過將訪問類成員變量的代碼放到專門的方法中,將其聲明為 synchronized ,并在主方法中調(diào)用來解決這一問題,但是 Java 為我們提供了更好的解決辦法,那就是 synchronized 塊。
Java的synchronized加在方法上或者對(duì)象上區(qū)別如下:
1.synchronized 在方法上,所有這個(gè)類的加了 synchronized 的方法,在執(zhí)行時(shí),會(huì)獲得一個(gè)該類的唯一的同步鎖,當(dāng)這個(gè)鎖被占用時(shí),其他的加了 synchronized 的方法就必須等待
2.加在對(duì)象上的話,就是以這個(gè)對(duì)象為鎖,其他也以這個(gè)對(duì)象為鎖的代碼段,在這個(gè)鎖被占用時(shí),就必須等待
對(duì)象是一個(gè)鎖標(biāo)志。按照先到先得的原則,如果有多個(gè)線程都會(huì)執(zhí)行代碼,并使用同一個(gè)對(duì)象作為鎖,
synchronize(對(duì)象){ .... }
那么,先執(zhí)行這段代碼的那個(gè)線程,將會(huì)獲得這個(gè)對(duì)象鎖,而當(dāng)這個(gè)線程執(zhí)行這段代碼的時(shí)候,其他線程也是使用這個(gè)對(duì)象作為鎖的,就不能執(zhí)行這段代碼,知道最初得到這個(gè)鎖的線程運(yùn)行完這段代碼,然后再把鎖分配給下一個(gè)線程執(zhí)行。
本文題目:java給代碼塊加鎖,java方法上加鎖
網(wǎng)站路徑:http://chinadenli.net/article49/dsishhh.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、面包屑導(dǎo)航、商城網(wǎng)站、移動(dòng)網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)公司、營銷型網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)