6 回答

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超10個(gè)贊
前面一種鎖的是實(shí)例對象,鎖定了當(dāng)前的那個(gè)對象,如果有多個(gè)實(shí)例對象,這些synchronized
方法之間不是同步的。第二種鎖的是類對象,類對象就一個(gè),所以是同步的。

TA貢獻(xiàn)1865條經(jīng)驗(yàn) 獲得超7個(gè)贊
public class Foo {
synchronized void test1() {
//to implements
}
void test2() {
synchronized(this) {
//to implements
}
}
synchronized static void test3() {
//to implements
}
static void test4() {
synchronized(Foo.class) {
//to implements
}
}
}
如上代碼,test1方法相當(dāng)于test2,當(dāng)this是同一個(gè)對象時(shí),會發(fā)生阻塞。當(dāng)然,不同對象沒有關(guān)系,因?yàn)閠his不一樣。稱為對象級鎖。
test3相當(dāng)于test4,這里是用class對象作為鎖,因?yàn)橐话闱闆r下一個(gè)類的類實(shí)例只有一個(gè),那么每次進(jìn)入這個(gè)方法都會鎖。稱為類級鎖。

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超11個(gè)贊
非靜態(tài)同步方法(A)用的鎖就是當(dāng)前實(shí)例對象本身,一個(gè)實(shí)例的A獲取鎖之后,該實(shí)例的其他A必須等待鎖的釋放,多個(gè)實(shí)例用的都是不同的鎖;
靜態(tài)同步方法(B)用的鎖是類對象本身,一旦一個(gè)B獲取鎖之后其他的B都必須等待釋放鎖,不管是一個(gè)實(shí)例還是多個(gè)實(shí)例;
另外 A和B之間用不同的鎖,所以不會有競爭關(guān)系;

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超11個(gè)贊
Class
類創(chuàng)建一個(gè)對象就是代表一個(gè)普通類,這時(shí)“類鎖”就是這個(gè)實(shí)例對象上的鎖

TA貢獻(xiàn)1895條經(jīng)驗(yàn) 獲得超3個(gè)贊
你說的是“互斥鎖”的概念,針對synchronized修飾方法有兩種情況:
【非靜態(tài)方法】
當(dāng)一個(gè)方法被synchronized修飾后,鎖對象為當(dāng)前方法所屬對象,即方法中的this。
【靜態(tài)方法】
當(dāng)一個(gè)靜態(tài)方法被synchronized修飾后,該靜態(tài)方法上鎖的對象為當(dāng)前類對象(Class類的實(shí)例)。每個(gè)類都有唯一的一個(gè)類對象。獲取類對象的方式:類名.class。
而對于互斥的場景,需要理解兩點(diǎn)說明:
1、靜態(tài)方法與非靜態(tài)方法同時(shí)聲明了synchronized,他們之間是非互斥關(guān)系的。原因在于,靜態(tài)方法鎖的是類對象而非靜態(tài)方法鎖的是當(dāng)前方法所屬對象。
2、當(dāng)Synchronized修飾的是兩段不同的代碼,但是鎖對象相同時(shí),兩個(gè)線程分別調(diào)用者兩段代碼時(shí)就是互斥的
所以你說的“一時(shí)刻只有一個(gè)線程能調(diào)用其中一個(gè)函數(shù)”(即互斥),判斷條件就是鎖對象是否相同,與方法類型無關(guān)。

TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個(gè)贊
對象方法的synchronized修飾,鎖為對象自身,也就是this;
靜態(tài)方法的synchronized修飾,鎖為Class對象自身,也就是由類加載器創(chuàng)建的類對象;
添加回答
舉報(bào)