的seprate屬性我有類如下所述:
兩個線程使用相同的對象,但是修改對象
public class Test {
public Test1 a;
public Test2 b;
}
現在我有2個線程。
線程1次修改「測試1」和線程2修改「的Test2」
還能有,而線程1修改「Test1的」類數據損壞即的可能性,但其間的線2進來,並開始修改「Test2」,因此更改丟失或數據被破壞/不完整的更新?
的seprate屬性我有類如下所述:
兩個線程使用相同的對象,但是修改對象
public class Test {
public Test1 a;
public Test2 b;
}
現在我有2個線程。
線程1次修改「測試1」和線程2修改「的Test2」
還能有,而線程1修改「Test1的」類數據損壞即的可能性,但其間的線2進來,並開始修改「Test2」,因此更改丟失或數據被破壞/不完整的更新?
在您描述的場景中,不能有任何數據損壞,因爲兩個修改範圍是不相交的。只有當一個線程試圖訪問另一個線程正在修改的數據時,纔會出現問題。修改Test1
不會影響Test
或Test2
。
感謝@Jim,清除了我的疑問 –
這是非常簡單:當一個以上的線程更寫入共享數據;那麼就有數據損壞的可能性。當一個線程寫入,和其他讀取,那麼這是讀者看到不一致的數據的機會。
在你的例子中,這似乎並非如此。
或者反過來想:如果修改的任何到現場以任何方式影響場b
a
;那麼你有一個問題。
但除此之外:public由外部組件處理的字段是不良風格。當需要更新a
時;那麼應該通過您的Test
對象的方法調用來實現。
除此之外:別忘了Single Responsibility Principle!組成「一個」班的事物密切相關。因此,在同一類別中擁有這兩個完全獨立的東西,聽起來也很奇怪......
_「當多個線程寫入共享數據時_」 - 實際上是當一個線程_modifies_數據被另一個線程讀取時。 –
我認爲我的發言是正確的;但錯過了一些東西。現在改變這一點。 – GhostCat
謝謝ghostCat。我確實使用過私人領域,並使用了getters&setter。上面的代碼就是例子。謝謝您的回答。類Test1和Test2分離和修改任何一個不會影響另一個。 –
你有這樣的想法嗎? –