多线程访问数组

fre*_*low 2 java arrays multithreading final initialization

class EverythingMustBeInAClass
{
    private final int i = 42;
    private final int[] a = {2, 3, 5, 7, 11, 13, 17, 19};
}
Run Code Online (Sandbox Code Playgroud)

i声明的事实final保证所有线程都看到相同的int值42(而不是0).

a声明的事实final保证所有线程都看到相同的数组引用.

但是我如何确保所有线程都看到相同的数组元素(而不是0)?我是否必须同步对数组的访问,即使我以后从未打算更改数组元素?

Gra*_*ray 5

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

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

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

报价:

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

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