1. 程式人生 > >JAVA物件鎖與類鎖

JAVA物件鎖與類鎖

1、被syncronized修飾的方法,是對類的物件加鎖,也就是說,當物件訪問該方法時,當前的物件會被加鎖,同一時刻同一物件不能再訪問該方法,或者該物件的其他被syncronized修飾的方法。不同物件,同一時刻可以訪問同一個syncronized方法或其他syncronized方法,兩個物件之間並不產生互斥關係。

2、被static、syncronized修飾的方法,是對類進行加鎖,也就是說,同一時刻只有一個類能訪問該方法。物件鎖與類鎖不會產生互斥關係。

如,Test 類有如下2個成員方法,被syncronized所修飾,

syncronized void funA(){...}
syncronized void funB(){...}

另有一個被syncronized所修飾的靜態方法,
<strong>static</strong> syncronized funC(){...}

Test 類的兩個例項,tatb ,則 ta tb 分別同時擁有funA()、funB()成員方法。

那麼上面一段話可以解釋如下:

1、在同一時刻,當ta物件去訪問funA()方法時,ta物件就被鎖定了,這時候ta是不能再去訪問funB()方法了;直到ta訪問funA()方法結束並對ta的鎖釋放後,ta才能繼續訪問funB()方法。

2、當ta物件去訪問funA()方法時,此時ta物件被鎖定了;假如同一時刻tb

物件也想去訪問funA()方法,是能成功訪問的,此時tb物件被鎖定了。因為tatb是兩個不同的物件,各自都擁有funA()、funB()方法,對兩個物件分別加鎖,並不會產生互斥關係。

3、當ta / tb訪問funX()方法時,假如此時想訪問Test類的funC()方法,是能訪問成功的。這也就是物件鎖與類鎖並不會產生互斥的關係。