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