2013-03-10 151 views
2

我有以下兩類:的Java:線程安全類的實例

public class MyClass { 

    public static void faceTheWorld(String Input){ 
     SafeClass sC = new SafeClass(); 
     sC.workWithInput(Input); 
    } 
} 

public class SafeClass { 
    public void workWithInput{String allInp) 

    work with allInp... 
} 

我的問題是。如果我幾次同時調用MyClass.FaceTheWorld(),它是否總是創建一個新的SafeClass類實例,或者它會試圖始終創建一個名爲'sC'的實例?

我需要創建一個實例數組來避免同時創建同一個實例嗎?這在Java中看起來如何?

最終,我試圖實現的是,當我用'輸入'調用FaceTheWorld時,它總是會確保'輸入'是線程安全的,例如,沒有其他實例可以修改/訪問它。

我讓SafeClass同步,這會解決問題嗎?

非常感謝

+0

我們很高興看到下面的java命名約定。 – AmitG 2013-03-10 16:53:40

+0

嗨阿米特,你是什麼意思? – L4zl0w 2013-03-10 16:56:39

+0

在編寫方法名稱時使用駱駝案例並在編寫類名時使用pascal案例(您遵循類名稱) – AmitG 2013-03-10 17:00:23

回答

1

它會每次創建一個新的實例,所以它應該是線程安全的,除非你沒有告訴我們任何其他奇怪的東西(比如在你調用的方法中使用靜態變量的那個對象)。但是如果你擔心它會在每次通話中使用相同的對象,它不會。

+0

謝謝凱文。我現在偏執於此,所以只是再次確認。即使在代碼中我們正在創建一個新實例的'C',在內存中它將永遠是一個不同的新實例?謝謝 – L4zl0w 2013-03-10 16:58:52

+0

@ L4zl0w正確 – 2013-03-10 16:59:22

1

只要你不訪問可以被其他線程(類的成員,或靜態變量),你將永遠不會有任何競爭條件改變的變量,如果你只是在創建新實例一個靜態方法(或任何其他方法),因爲每個方法都有自己的變量堆棧。

而且要具體到你的問題:

它總是會創建一個新的實例。

1

無論您多久初始化它,它總是會創建新實例。 Synchroznied關鍵字不能解決您的問題。