1. 程式人生 > >方法鎖、物件鎖和類鎖區別

方法鎖、物件鎖和類鎖區別

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比寫在程式碼塊上明顯顆粒度要大很多。效率也會更低。

參考:
方法鎖、物件鎖和類鎖區別