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)?我是否必须同步对数组的访问,即使我以后从未打算更改数组元素?
最佳答案
final
不仅保证可以看到数组引用,而且还保证对象本身已完全构造和初始化。因此数组中的值也将被所有线程看到。
这是关于该主题的一个很好的链接:
http://www.javamex.com/tutorials/synchronization_final.shtml
引用:
The fields on any object accessed via a final reference are also guaranteed to be at least as up to date as when the constructor exits.
但是,重要的是要注意 a
数组不是不可变的,因此,例如,您可以设置 a[0] = 10
并且该更新不会同步。但只要您不更改a
中的任何值,您就应该没问题。
关于java - 多线程访问数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11089428/