2017-02-22 63 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分离和修改任何一个不会影响另一个。 –