说我有一个Thread T1。我在该线程中创建了一个对象,例如Dog
并设置一些属性(name
,color
)等。
然后我将另一个线程T2(来自T1)线程化并将Dog
对象传递给它。在此之后,T1不会更改对象的任何属性,甚至不想读取它,而是保留实际引用(Dog d
)。
问题:
Dog
中的任何内容,那么Dog Thread是否安全(从可见性的角度来看.T2是否总能看到与T1设置的相同的名称和颜色)?答案 0 :(得分:2)
线程中的每个操作都可以看到该线程启动之前发生的任何事情。在您的示例中,T2保证在调用t2.start()
之前看到T1所做的所有更改。
这不会使Dog
线程安全,但您对该类的使用是线程安全的。
但请注意,在该点之后由T1或T2进行的任何后续更改都不能保证在其他线程中可见。
参考:JLS #17.4.5:
在启动线程中的任何操作之前,对线程的start()调用发生。
答案 1 :(得分:1)
Dog
才是线程安全的。
如果它们不易变,则T2可能会读取陈旧数据。
答案 2 :(得分:0)
只要:
Dog d
对象的属性时没有竞争条件或
Dog d
的属性访问受到竞争条件保护...你可以认为它是线程安全的。
我想说现在不可能说你的解决方案是否是线程安全的。因为没有提到有关数据访问原则或锁的内容。
我怀疑它不是线程安全的!
答案 3 :(得分:-1)
“狗线安全吗?”如果它不是一成不变的那么我就说不。
“从能见度角度来看.T2会不会看到与T1设定的名称和颜色相同的颜色?”大概。 (注意事情是否不稳定或同步。
处理此问题的简单方法是同步它。这将使它成为安全的。