1. 程式人生 > >java的執行緒鎖之synchronized

java的執行緒鎖之synchronized

關鍵字synchronized取得的鎖都是物件鎖,而不是把一段程式碼或方法(函式)當作鎖,這裡如果是把一段程式碼或方法(函式)當作鎖,其實獲取的也是物件鎖,只是監視器(物件)不同而已,哪個執行緒先執行帶synchronized關鍵字的方法,哪個執行緒就持有該方法所屬物件的鎖,其他執行緒都只能呈等待狀態。但是這有個前提:既然鎖叫做物件鎖,那麼勢必和物件相關,所以多個執行緒訪問的必須是同一個物件

package com.orac.zhang;
public class People {
	static int sum=0;
	public synchronized void fun() {
		for(int i=0;i<200;i++) {
			System.out.println("sum:"+sum);
			sum++;					
		}		
	}	
}

建立兩個不同的物件

package com.orac.zhang;
public class Test {
	public static void main(String[] args) {
		People people1=new People();
		People people2=new People();
		Thread thread1=new Thread() {	
			@Override
			public void run() {			
				people1.fun();
			}
		};
		Thread thread2=new Thread() {	
			@Override
			public void run() {			
				people2.fun();
			}
		};
		thread1.start();
		thread2.start();		
	}
}

 

執行結果發現兩個執行緒沒用同步執行,導致執行結果沒用從大到小排列

package com.orac.zhang;
public class Test {
	public static void main(String[] args) {
		
		People people=new People();
		Thread thread1=new Thread() {	
			@Override
			public void run() {			
				people.fun();
			}
		};
		Thread thread2=new Thread() {	
			@Override
			public void run() {			
				people.fun();
			}
		};
		thread1.start();
		thread2.start();		
	}
}

只用一個物件呼叫,執行結果是我們想要的

所以如果多個執行緒訪問的是多個物件,那麼Java虛擬機器就會建立多個鎖,就像上面的例子一樣,建立了兩個People物件,就產生了2個鎖。既然兩個執行緒持有的是不同的鎖,自然不會受到"等待釋放鎖"這一行為的制約。