java synchronized 關鍵字(1)物件監視器為Object
阿新 • • 發佈:2019-01-25
在java多執行緒中 synchronized 是非常重要的,也是經常用到的
對於synchronized關鍵字要注意兩點
synchronized物件監視器為Object的時候
synchronized物件監視器為Class的時候
物件監視器為Object
也就是synchronized鎖定的是物件
例如下面程式碼
public class A {
synchronized public void MethodA(){
System.out.println("this is MethodA");
}
synchronized public void MethodB(){
System.out.println("this is MethodB");
}
public void MethodC(){
System.out.println("this is MethodC");
}
}
建立物件 a 和b
A a = new A();
A b = new A();
當兩個執行緒分別呼叫 a.MethodA() 和 a.MethodB() 的時候 這兩個方法是不能同時執行的,因為synchronized 鎖的是a 這個物件,a 裡面被synchronized 關鍵字標記的方法只能序列,也就是同一時間只有一個synchronized 標記的方法能執行。a.MethodA() 執行 b.MethodB()就要等待,
但a.MethodC()可以執行,因為MethodC沒有被標記,屬於非現成安全。不受關鍵字影響。
a.MethodA()和b.MethodA() 可以同時執行,因為synchronized鎖的是物件,a和b屬於兩個物件,所以有兩把鎖分別鎖a和b,但相互之間不受影響。