2017-02-22 62 views
0

的seprate屬性我有類如下所述:
兩個線程使用相同的對象,但是修改對象

public class Test { 
    public Test1 a; 
    public Test2 b; 
} 

現在我有2個線程。

線程1次修改「測試1」和線程2修改「的Test2」

還能有,而線程1修改「Test1的」類數據損壞即的可能性,但其間的線2進來,並開始修改「Test2」,因此更改丟失或數據被破壞/不完整的更新?

+0

你有這樣的想法嗎? –

回答

1

在您描述的場景中,不能有任何數據損壞,因爲兩個修改範圍是不相交的。只有當一個線程試圖訪問另一個線程正在修改的數據時,纔會出現問題。修改Test1不會影響TestTest2

+0

感謝@Jim,清除了我的疑問 –

1

這是非常簡單:當一個以上的線程更寫入共享數據;那麼就有數據損壞的可能性。當一個線程寫入,和其他讀取,那麼這是讀者看到不一致的數據的機會。

在你的例子中,這似乎並非如此。

或者反過來想:如果修改的任何到現場以任何方式影響場ba;那麼你有一個問題。

但除此之外:public由外部組件處理的字段是不良風格。當需要更新a時;那麼應該通過您的Test對象的方法調用來實現。

除此之外:別忘了Single Responsibility Principle!組成「一個」班的事物密切相關。因此,在同一類別中擁有這兩個完全獨立的東西,聽起來也很奇怪......

+0

_「當多個線程寫入共享數據時_」 - 實際上是當一個線程_modifies_數據被另一個線程讀取時。 –

+0

我認爲我的發言是正確的;但錯過了一些東西。現在改變這一點。 – GhostCat

+0

謝謝ghostCat。我確實使用過私人領域,並使用了getters&setter。上面的代碼就是例子。謝謝您的回答。類Test1和Test2分離和修改任何一個不會影響另一個。 –