2010-10-23 105 views
6

我正在編寫高度併發的應用程序,它廣泛地修改了MyClass的對象。該課程由幾個領域組成。我的問題是如何防止其他線程序列化期間特定對象的修改?java對象序列化 - 線程安全嗎?

問候, 馬特

回答

7

通過synchronizing兩者序列化和修改對象狀態的方法。

+3

包括修改任何子對象(包含在對象的字段中)的狀態。 – Thilo 2010-10-23 11:35:03

+3

雖然同步解決了您的線程安全問題,但它通過序列化所有訪問來實現此目的,因此您的應用程序基本上是單線程的,而不是併發的。 – 2010-10-26 00:16:39

4

爲什麼修改MyClass?更好的方法(併發處理更容易)是爲狀態對象創建新的不可變版本,並在更新時使用AtomicReference對其進行CAS處理。例如:

final class MyClass { 
    final int age; 
    final String name; 
    final String address; 

    MyClass(int age, String name, String address) {…} 

    MyClass setNameAndAddress(String name, String address) {return new MyClass(age, name, address);} 
} 

然後,序列化不是一個問題,因爲你正在處理一個不可變的對象。您的存儲引用只能從一個有效狀態更改爲另一個有效狀態,並且可以以原子方式執行多個更新。