java的執行緒鎖之synchronized
阿新 • • 發佈:2018-11-25
關鍵字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個鎖。既然兩個執行緒持有的是不同的鎖,自然不會受到"等待釋放鎖"這一行為的制約。