2012-11-18 35 views
2

按我的理解,我們用「同步聲明」在Java中停止多個線程之間的干擾。
意義{}在java中

現在我想了解expr的在下面的表達式的意義。

同步的(表達式){ 語句 }

因爲看起來象鎖定行爲取決於EXPR對象上。

例如

public class Sync extends Thread { 
    static int [] arr = {0,1,2}; 
    Object lock = new Object(); 
    public static void main(String[] args){ 

     Sync ob1 = new Sync(); 
     Sync ob2 = new Sync(); 
     ob1.start(); 
     ob2.start(); 

    } 
    @Override 
    public void run() { 
     synchronized (arr) { 
      for(int i = 0;i < arr.length; ++i){ 
       try { 

        Thread.sleep(500); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       System.out.println(Thread.currentThread().getName() + " " + arr[i]); 

      } 
     } 

    } 
} 

現在,在上面的例子中,當我在同步語句中使用「ARR」對象如下(同步(ARR))我得到一致預期的輸出。
線程0 0
線程0 1
線程0 2
線程1 0
線程1 1
線程1 2

當我使用 「鎖定」 但是對象在synchronized語句中(synchronized(lock)),我得到的輸出如下。

線程0 0
線程1 0
線程0 1
線程1 1
線程0 2
線程1 2

不應輸出是相同在這兩種情況下。

感謝,
山塔努

回答

3

arr Object在本質上是靜態的,所以這兩個線程共享相同的改編,在外殼鎖定爲instance object它有兩種不同的情況下兩個線程。

所以當你在這裏與arr對象進行同步時,任何首先進入保持鎖的arr object塊並將完成其執行的線程將等待,直到第一個線程完成或釋放鎖。

在鎖定對象的情況下,它是完整的兩個不同的對象(兩個資源),因此每個線程持有不同的資源或對象的鎖,所以執行將是平行的。