多线程访问数组

时间:2012-06-18 19:08:52

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

3 个答案:

答案 0 :(得分:5)

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

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

  

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

引用:

  

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

但是,请务必注意a数组不可变,因此,例如,您可以设置a[0] = 10并且不会同步该更新。但只要您更改a中的任何值,您就应该做得很好。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

如果数据结构使用关键字final,则不必同步访问。只要您从不写入变量,就可以根据需要同时进行多次同步读取。如果不使用final关键字,则需要在需要访问变量时随时锁定变量。