示例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方法 某個執行緒訪問同步方法不影響其他執行緒訪問非同...