说我有一个线程T1。我在该线程中创建了一个对象,例如Dog
和设置一些属性(name
,color
)等MultipleThreads和同步线程可见性
然后我线程另一个线程T2(从T1)和Dog
对象传递给它。在此之后,T1不会更改对象的任何属性,甚至不想读取它,但会保留到实际参考(Dog d
)。
问:
- 假设T2不
Dog
改变什么,狗是线程安全的(从知名度待机点将T2总是看到由T1设置相同的名称和颜色。)?
说我有一个线程T1。我在该线程中创建了一个对象,例如Dog
和设置一些属性(name
,color
)等MultipleThreads和同步线程可见性
然后我线程另一个线程T2(从T1)和Dog
对象传递给它。在此之后,T1不会更改对象的任何属性,甚至不想读取它,但会保留到实际参考(Dog d
)。
问:
Dog
改变什么,狗是线程安全的(从知名度待机点将T2总是看到由T1设置相同的名称和颜色。)?Dog
是线程安全只有当值只是实例变量震荡。
如果它们不是不稳定的,T2有可能读取陈旧的数据。
“狗线程安全吗?”如果它不是一成不变的,那么我会说不。
“从知名度的角度来看,T2总是会看到与T1所设定的名称和颜色相同的颜色吗?”大概。 (注意,如果事情不挥发或同步。
简单处理这个办法是在其上同步。这将使它的tHead安全。
在一个线程中的每个动作可以看出,线程之前不管发生什么事情开始在你的榜样,T2是保证看到T1进行的所有更改t2.start()
被称为前。
这不会让Dog
线程安全的,但你的这个类的使用是线程安全的。
然而要注意之后由T1或T2进行的任何后续更改点不能保证从其他线程可见。
参考:JLS #17.4.5:
调用开始()上线之前发生在启动线程的任何行动。
只要:
Dog d
对象的属性或
Dog d
时是免费的竞态条件“ s属性的访问受到保护,免受竞争条件的影响...你可以认为它是线程安全的。
我现在说现在不可能说你的解决方案是否是线程安全的。因为没有提及数据访问原理或锁。
我怀疑它不是线程安全的!
两个线程都不改变Dog实例,它绝对是线程安全的 – hoaz
仅仅因为你选择不改变对象并不意味着它是线程安全的。使用这个逻辑,* everything *将是线程安全的。您似乎在谈论Java的线程缓存而不是线程的可见性*安全* –