java - 多线程访问数组

标签 java arrays multithreading initialization final

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/

相关文章:

java - 在java上更新arraylist中元素的属性?

java - 使用 values() 方法从 LinkedHashMap 获取条目的 LinkedList

python - Numpy:索引 3D 数组,最后一个轴的索引存储在 2D 数组中

arrays - VBA:创建类模块数组

c# - 使用 bool 来同步多个线程是否安全?

java - java.lang.Class.getResources的使用

java - OSGi 中的传递依赖

arrays - Powershell 将字符串重新评估为数组

c - 使用 C/Pthreads : do shared variables need to be volatile?

java - 冷聚变 : Runtime show logs on CF page just like Console or Putty