2
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)?我是否必须同步对数组的访问,即使我以后不打算更改数组元素?

4

3 回答 3

5

final不仅保证可以看到数组引用,而且保证对象本身已经完全构造和初始化。所以数组中的值也会被所有线程看到。

这是关于该主题的一个很好的链接:

http://www.javamex.com/tutorials/synchronization_final.shtml

去引用:

通过最终引用访问的任何对象上的字段也保证至少与构造函数退出时一样最新。

但是,重要的是要注意a数组不是不可变的,例如,您可以设置a[0] = 10并且更新不会同步。但只要你改变任何价值观,a你应该是好的。

于 2012-06-18T19:10:28.683 回答
1

如果您永远不会更改内容,那么您是安全的,因为“发生在语义之前”和最终。

于 2012-06-18T19:11:11.710 回答
0

不,如果数据结构使用关键字 final,则不必同步访问。只要您从不写入变量,您就可以根据需要进行尽可能多的同时读取。如果您不使用 final 关键字,则需要在您想要访问它的任何时候锁定该变量。

于 2012-06-18T19:11:49.197 回答