【发布时间】:2013-11-14 21:05:44
【问题描述】:
只是为了确保。 我正在关注 Java Concurrency in practice book。 当谈到安全发布时,尤其是使用 final 时,我很清楚首先引用将对所有其他线程可见,其次发布对象的状态对任何其他线程都是可见的,但这里的问题是,如果引用的数组元素是否保证在发布状态时可见? (当然,只要没有人修改这些数据对象)。
例子:
@Mutable
public class NotThreadsafeDataObject {
private String message;
public NotThreadsafeDataObject (String message) {
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
现在让我们安全地发布一组可变对象:
public class Publish {
public final NotThreadsafeDataObject[] publish;
public Publish() {
publish = new NotThreadsafeDataObject[] { new NotThreadsafeDataObject("one"), new NotThreadsafeDataObject("two")};
}
}
【问题讨论】:
-
据我了解,final 表示(对于对象)引用不会改变。但是,该对象的内部状态可能仍会发生变化,并且仍然允许线程获取它们自己的这些内部缓存。 volatile 关键字防止线程保留自己的缓存
-
被引用的对象及其引用的对象在发布后不会改变……按照惯例。我想知道使用 final 字段安全发布后数组内引用的可变对象的可见性。
标签: java multithreading visibility