class EverythingMustBeInAClass
{
private final int i = 42;
private final int[] a = {2, 3, 5, 7, 11, 13, 17, 19};
}
声明i
final
的事实保证所有线程都看到相同的int值42(而不是0)。
声明a
final
的事实保证所有线程都看到相同的数组引用。
但是如何确保所有线程都看到相同的数组元素(而不是0)?我是否必须同步对数组的访问,即使我以后从未打算更改数组元素?
答案 0 :(得分:5)
final
不仅可以保证看到数组引用,还可以保证对象本身已经完全构造和初始化。因此,所有线程也会看到数组中的值。
这是关于这个主题的一个很好的链接:
http://www.javamex.com/tutorials/synchronization_final.shtml
引用:
通过最终引用访问的任何对象上的字段也保证至少与构造函数退出时一样最新。
但是,请务必注意a
数组不不可变,因此,例如,您可以设置a[0] = 10
并且不会同步该更新。但只要您不更改a
中的任何值,您就应该做得很好。
答案 1 :(得分:1)
如果您永远不会更改内容,那么由于“在语义之前发生”和最终结果,您将是安全的。
答案 2 :(得分:0)
如果数据结构使用关键字final,则不必同步访问。只要您从不写入变量,就可以根据需要同时进行多次同步读取。如果不使用final关键字,则需要在需要访问变量时随时锁定变量。