2012-06-21 53 views
5

下面的代碼會發生什麼?同步是否工作?這是一個面試問題。如果同步變量在java中被重新分配會發生什麼?

class T 
{ 
    public static void main(String args[]) 
    { 
     Object myObject = new Object(); 
     synchronized (myObject) 
     { 
      myObject = new Object(); 
     } // end sync 
    } 
} 
+4

您的同步塊位於主體內而不在循環內,它將只能運行一次。在這裏同步沒有意義(除非你從另外一個主叫來,這將是奇怪的主)。 – assylias

回答

4

每次輸入同步塊時,都會在不同的對象上進行同步。大多數情況下,除了讓你感到困惑之外,這不會做任何事情,但是兩個線程看到同一個對象並等待的可能性很小。

因此,如果您在非final的字段上同步,任何代碼分析器都會給出警告。

1

它仍然釋放出被收購的同一臺監視器,但任何其他代碼也鎖定使用myObject(這裏不可能,因爲它是一個局部變量,使得同步根本沒有意義)將開始使用新的對象。

不要忘記,同步適用於對象(或更確切地說,監視器與對象關聯) - 不是變量。正在獲取/釋放的監視器取決於達到同步塊的開始時的表達式的值。在同步塊的末尾重新評估表達式而不是

0

不,它不起作用。每當有新線程進入時,都會創建一個新的myObject。特別是現在myObject是一個局部變量!

即使myObject是類成員,它也不起作用,因爲您將更改鎖定的對象。有關更詳細的解釋,請參閱有關synchronization of non-final field的問題。

0

我看不到這個代碼背後的原因,因爲對象不被任何線程共享。在任何情況下,刪除同步塊都不會影響真實結果。它只會讓你的代碼更快運行

0

你需要先獲得myObject的鎖,如果這個鎖被阻塞,你必須等到鎖被釋放。

同步需要多線程環境。但是你的代碼似乎與併發無關。所以我很遺憾地告訴你,沒有任何事情會發生。

0

運行代碼並分析結果。

public class Test { 
    static Foo o = new Foo(0); 
    static class Foo { 
     private int i = 0; 
     Foo(int i) { 
      this.i = i; 
     } 
     public void addOnce() { 
      this.i++; 
     } 
     public String toString() { 
      return String.valueOf(i); 
     } 
    } 
    public static void main(String args[]) { 
     test1(); 
     try {Thread.sleep(10000);} catch (Exception e) {} 
     test2(); 
    } 
    public static void test1() { 
     Runnable r = new Runnable() { 
      public void run() { 
       synchronized (o) { 
        System.out.println("1------>"+o); 
        o = new Foo(1); 
        try {Thread.sleep(3000);} catch (Exception e) {} 
        System.out.println("1------>"+o); 
       } 
      } 
     }; 
     new Thread(r).start(); 
     new Thread(r).start(); 
    } 
    public static void test2() { 
     Runnable r = new Runnable() { 
      public void run() { 
       synchronized (o) { 
        System.out.println("2------>"+o); 
        o.addOnce(); 
        try {Thread.sleep(3000);} catch (Exception e) {} 
        System.out.println("2------>"+o); 
       } 
      } 
     }; 
     new Thread(r).start(); 
     new Thread(r).start(); 
    } 
} 
相關問題