synchronized關鍵字使用剖析

synchronized關鍵字,代表這個方法加鎖,相當於不管哪一個線程(例如線程A),運行到這個方法時,都要檢查有沒有其它線程B(或者C、 D等)正在用這個方法,有的話要等正在使用synchronized方法的線程B(或者C 、D)運行完這個方法後再運行此線程A,沒有的話,直接運行。它包括兩種用法:synchronized 方法和 synchronized 塊。

 

 

主要有兩種用法:synchronized方法和synchronized代碼塊

 

對於synchronized方法,有如下作用:

public synchronized void syncCounter(int newVal){
		System.out.println("synchronized方法...");
	}

 

確保了同一時刻對於每一個類實例,其所有聲明爲 synchronized 的成員函數中至多隻有一個synchronized方法處於可執行狀態(因爲至多隻有一個能夠獲得該類實例對應的鎖),從而有效避免了類成員變量的訪問衝突(只要所有可能訪問類成員變量的方法均被聲明爲 synchronized)。

synchronized 方法也有它的缺陷
若將一個大的方法聲明爲synchronized 將會大大影響效率,典型地,若將線程類的方法 run() 聲明爲 synchronized ,由於在線程的整個生命期內它一直在運行,因此將導致它對本類任何 synchronized 方法的調用都永遠不會成功。當然我們可以通過將訪問類成員變量的代碼放到專門的方法中,將其聲明爲 synchronized ,並在主方法中調用來解決這一問題,但是 Java 爲我們提供了更好的解決辦法,那就是 synchronized 塊。

 

 

對於synchronized代碼塊:

synchronized 塊是這樣一個代碼塊,其中的代碼必須獲得對象 syncObject (如前所述,可以是類實例或類,eg. this)的鎖方能執行,具體機制同前所述。由於可以針對任意代碼塊,且可任意指定上鎖的對象,故靈活性較高。

int i=100,userId=2;
	String userName="SyncMM";
	public void methodName(){
		synchronized(this){
			i++;
			System.out.println("Synchronized param i:"+i);

		}
		System.out.println("userName:"+userName);
	}


 

未完待續!
發佈了329 篇原創文章 · 獲贊 25 · 訪問量 198萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章