synchronized鎖住的物件問題

2021-07-30 12:46:55 字數 1429 閱讀 8359

示例1:

package com.執行緒間通訊;

public class mutithread1 else

} catch (interruptedexception e)

system.out.println("tag "+tag+",a="+a);

}public static void main(string args)

});thread t2 = new thread(new runnable()

});t1.start();

t2.start();}}

這段**執行出來的結果為:

tag a, set number over

tag b set number over

tag b,a=200

tag a,a=100

解釋:m1和m2是兩個不同的物件。m1物件呼叫print方法,synchronized鎖住的物件為m1。而m2物件呼叫print方法,synchronized鎖住的物件為m2。

所以synchronized關鍵字沒有實現鎖住同一物件,也就達不到鎖的目的了。

示例2:

package com.執行緒間通訊;

public class mutithread1 else

} catch (interruptedexception e)

system.out.println("tag "+tag+",a="+a);

}public static void main(string args)

});thread t2 = new thread(new runnable()

});t1.start();

t2.start();}}

示例2執行的結果為:

tag a, set number over

tag a,a=100

tag b set number over

tag b,a=200

解釋:示例2**中,在print方法的前面加上了static關鍵字,隨之變數a也要加上static,這時的print方法是屬於mutithread1物件的。

所以m1呼叫print方法時,synchronized關鍵字鎖住的物件為mutithread1。而m2物件呼叫print方法時,synchronized關鍵字鎖住的物件也為mutithread1。

這樣synchronized鎖住的是同乙個物件。實現了鎖同步。

總結:關鍵字synchronized取得的鎖都是物件鎖,而不是把一段**(方法)當做鎖,所以示例**中哪個執行緒先執行synchronized關鍵字的方法,哪個執行緒就持有

該方法所屬物件的鎖(lock),兩個物件,執行緒就是獲得的兩個不同的鎖,他們之間互不影響。

有一種情況是獲得相同的鎖,即在靜態方法上加上synchronized關鍵字,表示鎖定的是.class類,類一級別的鎖(獨佔.class類)

synchronized鎖住物件筆記

1.synchronized用在靜態方法的時候,表示執行這個方法時,將會把呼叫該方法的物件給鎖住。2.synchronized this 的時候,表示執行synchronized內的 時,鎖住this物件,也就是當前 所在類的物件。3.synchronized other class 的時候,表示執...

synchronized鎖住了誰

先來看一段 public class multithread else system.out.println tag tag num num catch interruptedexception e 注意觀察run方法輸出順序 public static void main string args ...

synchronized鎖住的是什麼?

物件鎖 同步方法鎖住的是物件 a.乙個物件 有多個synchronized方法 某一時刻內,只要有乙個執行緒去呼叫其中乙個synchronized 方法,其他的執行緒都要等待。b.乙個物件中 synchronized方法 非synchronized方法 某個執行緒訪問同步方法不影響其他執行緒訪問非同...