使用synchronized之后,並不是說synchronized鎖定的方法或者代碼塊要一次性執行完,才能跳轉到其他線程。而是當兩個並發線程訪問同一個對象object中的這個synchronized(this)同步代碼塊時,一個時間內只能有一個線程得到執行。另一個線程必須等待當前線程執行完這個代碼塊以后才能執行該代碼塊。也即是說,即使給某個方法加鎖了,如果其他線程訪問不是這個方法時,線程依然可以跳轉。如下例子:
1 public class test2{ 2 public static void main(String[] args) { 3 Thread a=new A2(); 4 Thread b=new B2(); 5 a.start(); 6 b.start(); 7 } 8 } 9 10 class A2 extends Thread{ 11 public void run(){ 12 show1(); 13 } 14 public synchronized void show1(){ 15 for(int i=0;i<20;i++){ 16 System.out.print(i); 17 } 18 } 19 } 20 21 class B2 extends Thread{ 22 public void run(){ 23 show2(); 24 } 25 public synchronized void show2(){ 26 for (int i = 0; i < 20; i++) { 27 System.out.print(i); 28 } 29 } 30 }
創建了兩個線程,分別訪問自己的加鎖show方法,最終的結果不一定是兩個連續的1-19,我的運行結果如下:
001122334455667788991010111112121313141415161718191516171819
所以synchronized只是對於訪問同一方法的不同線程有效。