方法鎖、物件鎖和類鎖區別
阿新 • • 發佈:2018-12-17
synchronized用來處理多個執行緒同時訪問同一個類的一個程式碼塊、方法,甚至這個類。
(1)修飾程式碼塊時,需要設定一個參考物件作為鎖的物件(物件鎖)。
(2)修飾方法時,預設是當前對線作為鎖的物件。
(3)修飾類時,預設是當前類的Class物件作為鎖的物件。
1、物件鎖
當一個物件中有同步方法或者同步塊,執行緒呼叫此物件進入該同步區域時,必須獲得物件鎖。如果此物件的物件鎖被其他呼叫者佔用,則進入阻塞佇列,等待此鎖被釋放(同步塊正常返回或者拋異常終止,由JVM自動釋放物件鎖)。
注意,方法鎖也是一種物件鎖。當一個執行緒訪問一個帶synchronized方法時,由於物件鎖的存在,所有加synchronized的方法都不能被訪問(前提是在多個執行緒呼叫的是同一個物件例項中的方法)。
預設就是鎖定物件的方法鎖;
public class object {
public synchronized void method(){
System.out.println("我是物件鎖也是方法鎖");
}
}
需要設定具體物件的程式碼塊鎖
public class object {
public void method(){
synchronized(this){
System.out.println("我是物件鎖");
}
}
}
2、類鎖
一個class其中的靜態方法和靜態變數在記憶體中只會載入和初始化一份,所以,一旦一個靜態的方法被申明為synchronized,此類的所有的例項化物件在呼叫該方法時,共用同一把鎖,稱之為類鎖。
也是兩種形式:
對應到物件鎖,也是看鎖定的位置是否需要顯示指定物件名。類的物件就是Object;
public class object {
public static synchronized void method(){
System.out.println("我是第一種類鎖");
}
}
需要顯示指定鎖定物件的程式碼塊鎖
public class object {
public void method(){
synchronized (object) {
System.out.println("我是第二種類鎖");
}
}
}
3. synchronized位置的區別
在物件鎖或者類鎖中,synchronized的位置就是鎖的大小,寫在類名上的synchronized比寫在程式碼塊上明顯顆粒度要大很多。效率也會更低。
參考:
方法鎖、物件鎖和類鎖區別