MultipleThreads和同步线程可见性

时间:2013-05-15 15:08:58

标签: java concurrency

说我有一个Thread T1。我在该线程中创建了一个对象,例如Dog并设置一些属性(namecolor)等。

然后我将另一个线程T2(来自T1)线程化并将Dog对象传递给它。在此之后,T1不会更改对象的任何属性,甚至不想读取它,而是保留实际引用(Dog d)。

问题:

  1. 假设T2没有改变Dog中的任何内容,那么Dog Thread是否安全(从可见性的角度来看.T2是否总能看到与T1设置的相同的名称和颜色)?

4 个答案:

答案 0 :(得分:2)

线程中的每个操作都可以看到该线程启动之前发生的任何事情。在您的示例中,T2保证在调用t2.start()之前看到T1所做的所有更改。

这不会使Dog线程安全,但您对该类的使用是线程安全的。

但请注意,在该点之后由T1或T2进行的任何后续更改都不能保证在其他线程中可见。


参考:JLS #17.4.5

  

在启动线程中的任何操作之前,对线程的start()调用发生。

答案 1 :(得分:1)

只有当值只是实例变量且是volatile时,

Dog才是线程安全的。

如果它们不易变,则T2可能会读取陈旧数据。

答案 2 :(得分:0)

只要:

  • 您的实现保证在同时通过多个线程访问Dog d对象的属性时没有竞争条件

  • Dog d的属性访问受到竞争条件保护

...你可以认为它是线程安全的。

我想说现在不可能说你的解决方案是否是线程安全的。因为没有提到有关数据访问原则或锁的内容。

我怀疑它不是线程安全的!

答案 3 :(得分:-1)

“狗线安全吗?”如果它不是一成不变的那么我就说不。

“从能见度角度来看.T2会不会看到与T1设定的名称和颜色相同的颜色?”大概。 (注意事情是否不稳定或同步。

处理此问题的简单方法是同步它。这将使它成为安全的。