歡迎來(lái)到 常識(shí)詞典網(wǎng) , 一個(gè)專業(yè)的常識(shí)知識(shí)學(xué)習(xí)網(wǎng)站!
[ Ctrl + D 鍵 ]收藏本站
答案 1:
要明白兩個(gè)問題,1.鎖的對(duì)象是誰(shuí),2.誰(shuí)持有了鎖。假設(shè)方法A和B是在同一個(gè)類Test中的兩個(gè)方法。Test t=new Test();t.met-odB();這個(gè)時(shí)候,met-odB方法被調(diào)用時(shí),因?yàn)榧恿藄ync-ronized ,需要先獲得一個(gè)鎖,這個(gè)鎖的對(duì)象應(yīng)該是t,也就是當(dāng)前的這個(gè)Test類的實(shí)例,而獲得鎖的東西是線程,也就是說(shuō)當(dāng)前線程拿到了t的鎖(而不是你說(shuō)的B方法獲得鎖),這個(gè)時(shí)候B方法內(nèi)調(diào)用met-odA,因?yàn)锳也加了sync-ronized,也需要獲得一個(gè)鎖,因?yàn)锳和B都是Test類中的方法,所以當(dāng)前線程要獲得的鎖的對(duì)象也是t。由于當(dāng)前線程在執(zhí)行B方法時(shí)已經(jīng)持有了t對(duì)象的鎖,因此這時(shí)候調(diào)用met-odA是沒有任何影響的,相當(dāng)于方法A上沒有加sync-ronized。另一種情況:假設(shè)現(xiàn)在有兩個(gè)Test類Test t1=new Test();Test t2=new Test();t1.met-odB();//此時(shí)當(dāng)前線程持有了t1對(duì)象的鎖t2.met-odB();//此時(shí)當(dāng)前線程也持有了t2對(duì)象的鎖當(dāng)前線程持有了兩把鎖,鎖的對(duì)象分別是兩個(gè)不同的Test類的實(shí)例t1和t2,互相沒有影響。再一種情況:假設(shè)在多線程環(huán)境下,兩個(gè)線程都可以訪問Test t=new Test();此時(shí)假設(shè)t-read1里調(diào)用t.met-odB();同時(shí)t-read2里調(diào)用t.met-odB()這時(shí)假設(shè)t-read1先搶到t對(duì)象的鎖,那么t-read2需要等待t-read1釋放t對(duì)象的鎖才可以執(zhí)行B方法。結(jié)果像這樣:t-read1獲得t的鎖--t-read1執(zhí)行met-odB--t-read1執(zhí)行met-odA--釋放t的鎖---t-read2獲得t的鎖--t-read2執(zhí)行met-odB--t-read2執(zhí)行met-odA--釋放t的鎖。sync-ronized還有很多種使用方法,但只有明白是那條線程獲得哪個(gè)對(duì)象的鎖,就很容易明白了。答案 2:
加在非static方法上的sync-ronized方法是和sync-ronized(t-is)塊等價(jià)的,均為對(duì)象鎖,即對(duì)t-is加鎖。獲得當(dāng)前對(duì)象鎖的線程,可以繼續(xù)獲得當(dāng)前對(duì)象鎖,JVM負(fù)責(zé)-對(duì)象被加鎖的次數(shù)。線程運(yùn)行B方法,此時(shí)如果t-is鎖可以用,線程獲得該鎖,線程給對(duì)象加鎖,計(jì)數(shù)器變成1,然后B方法調(diào)用A方法,由于是對(duì)同一個(gè)對(duì)象同一個(gè)線程,線程可以繼續(xù)獲得鎖,計(jì)數(shù)器變?yōu)?,表示t-is被加鎖2次。A方法完畢后,線程釋放鎖,計(jì)數(shù)器變?yōu)?,此時(shí)對(duì)象鎖對(duì)其他線程依然是不可獲得的。B方法完畢后,線程繼續(xù)釋放鎖,此時(shí)計(jì)數(shù)器變?yōu)?,表示鎖被完全釋放,其他線程可以獲得對(duì)象鎖。答案 3:
可以,一個(gè)線程對(duì)同一個(gè)對(duì)象的鎖可以反復(fù)獲取。這種同步鎖稱為可重入的鎖。答案 4:
sync-ronized 鎖機(jī)制存在重入的特性,就是可以重復(fù)獲取同一個(gè)對(duì)象的鎖答案 5:
met-odA試圖在上面獲得鎖的對(duì)象如果就是met-odB所鎖住的那個(gè)對(duì)象,那就可以吧答案 6:
寫在方法上的sync-ronized,鎖的對(duì)象是t-is進(jìn)入一次,計(jì)數(shù)器+1,離開,計(jì)數(shù)器-1答案 7:
鎖的基本機(jī)制 @beralee將的很清楚;@孫立偉講了反復(fù)獲取鎖。反復(fù)獲取鎖是有意義的。@鄧梁 同學(xué)補(bǔ)充了較詳細(xì)的正常流程的解除嵌套鎖的計(jì)數(shù)器實(shí)現(xiàn)。我稍微補(bǔ)充一句:與之相對(duì)的問題還有,方法拋出異常時(shí),線程足夠聰明以釋放所有反復(fù)獲取到到的鎖。詳情可以參考官方的虛擬機(jī)規(guī)范。答案 8:
只要明白兩個(gè)問題就好了。1:誰(shuí)獲取了鎖。2:獲取了誰(shuí)的鎖。下一篇:武漢給大家的文化形象是怎樣的? 下一篇 【方向鍵 ( → )下一篇】
上一篇:有自己的上半身照片,如何制作自己的漫畫頭像? 上一篇 【方向鍵 ( ← )上一篇】
快搜