2015-01-20 101 views
0
//What will happen when you attempt to compile and run the following code? 

public class TestThread extends Thread { 
    public static void main(String[] args) { 
     new TestThread().start(); 
     new TestThread().start(); 
    } 

    public void run() { 
     Safe s1 = new Safe("abc"); 
     Safe s2 = new Safe("xyz"); 
    } 
} 

class Safe { 
    String str; 

    public synchronized Safe(String s) { 
     str = s; 
     str = str.toUpperCase(); 
     System.out.print(str + " "); 
    } 
} 

爲什麼這個方法公開同步安全(字符串S)給我一個編譯錯誤?我知道我們不能同步變量,但是上面的代碼有什麼問題?!?!爲什麼這種同步方法給我一個錯誤?

+0

你期望它做什麼?在構建完成之前,您無法共享對象。 – 2015-01-20 22:24:40

回答

8

構造像這樣不能同步:

public Safe(String s) 

這是沒有意義的synchronize一個構造函數,因爲每一個構造函數被調用時,它正在一個獨立的,新的對象。即使兩個構造函數同時工作,它也不會發生衝突。

Section 8.8.3 of the JLS指明瞭可以修改器允許在一個構造函數,​​是不是其中之一:

ConstructorModifier:

註釋公衆保護私人

而且,它規定:

T這裏沒有實際的需要同步構造函數,因爲它會鎖定正在構建的對象,在對象的所有構造函數完成其工作之前,這些對象通常不會被其他線程使用。

有沒有必要,所以它是不允許的。

1

構造函數(據我所知)不能同步。因爲當你調用構造函數時,它會在內存中創建一個新的位置。這個新的位置在創建之前不能同時嘗試訪問2個事物,因此不需要同步構造函數。你的方法應該是:

public Safe(String s) { 
    str = s; 
    str = str.toUpperCase(); 
    System.out.print(str + " "); 
} 
相關問題