2012-03-28 61 views
3

我想通過一個靜態工廠方法的對象,如的Java:靜態工廠方法和線程安全

Person p = Person.fromName("Jack"); 

class Person { 
    public static Person fromName(String name){ 
     return new Person(name); 
    } 
} 

但FROMNAME()方法不是線程安全的,(FROMNAME()僅僅是一個例子,當它在我的程序中運行時,這種方法會發生錯誤),但是,如果同步此方法效率不高,因爲多個線程應該同時調用此方法。有沒有解決它的建議?

+0

所以,你想要一個ObjectPool的,返回同一個人的實例爲同樣的名字?否則,應該沒有問題。 – synopia 2012-03-28 09:30:57

+0

您希望使線程安全,並允許多個線程同時訪問它。 – 2012-03-28 09:33:57

+0

@ChandraSekhar是的,這就是我想要的 – remy 2012-03-28 09:44:07

回答

1

你的問題似乎無法解決的,當你說

    A)的方法不是線程安全的(因此需要以同步的方式使用)和

    B)由於效率原因它可能不同步。

我可以給你的唯一建議是執行爲細粒度syncrhonization成爲可能,即只有在同步線程不安全部分的方法

例如如果聲明S1需要與S2中自動執行的,你可以改爲做

public synchronized static Person fromName(String name){ 
    ... 
    S1; 
    S2; 
    ... 
    return ...; 
} 

一起做

public static Person fromName(String name){ 
    ... 
    synchronized (lock) { 
     S1; 
     S2; 
    } 
    ... 
    return ...; 
} 
+0

謝謝,我知道我可以沒有使用同步的靜態工廠方法,所以我決定使用對象方法而不是類方法。 – remy 2012-03-28 09:46:06

+1

當然你可以有同步的靜態方法。誰告訴你,你不能在靜態方法中使用'synchronized'? – aioobe 2012-03-28 09:47:33

2

如果你有代碼是不安全的多線程併發執行,但是你想從多個線程調用它,這聽起來像你真的只有兩種選擇:

  • 它線程安全
  • 通過同步

您還沒有給出這將表明該方案最適合你的情況的任何信息以序列化的呼叫命中。 (你有沒有測量同步的性能衝擊嗎?你有沒有試圖使它線程安全的?)

+0

是的,我試圖讓它線程安全,但效率很低,所以我決定使用對象方法而不是類方法。非常感謝你 – remy 2012-03-28 09:48:10

+3

@remy:這真的不能解釋你在做什麼......聽起來你可能對線程安全涉及什麼有一些可疑的信仰...... – 2012-03-28 09:49:14