在什么情况下你需要在Java中同步数组?

时间:2015-06-04 00:22:45

标签: java arrays multithreading thread-safety

在什么情况下你需要同步数组?

我的想法是,你需要同步访问吗?假设两个线程同时访问该阵列,那会崩溃吗?

如果有人正在阅读,而有人正在阅读,该怎么办? (单独的值,在不同的情况下相同)

编辑不同的东西?

或者,当您不同步时,是否没有类似于阵列的JVM崩溃?

2 个答案:

答案 0 :(得分:1)

  

在什么情况下你需要同步数组?

你要么总是需要,要么永远不需要。就像@EJP所说的那样,他从来没有这样做过,因为几乎总是比数组更好的数据结构,无论如何(编辑:有很多很好的数据用例,但它们几乎总是孤立地使用。例如ArrayList)。但是如果你坚持在线程之间共享数组,那么数组元素是不易变的,所以由于可能的缓存,你会在不使用synchronized的情况下获得不一致和损坏的数据。

  

我的想法是,你需要同步访问吗?假设两个线程同时访问该阵列,那会崩溃吗?

崩溃,不,但您的数据可能不一致,如果它们在32位架构上是64位,则会产生额外的不一致。

  

如果有人正在阅读,而有人正在阅读,该怎么办? (单独的值,在不同的情况下相同)

请不要。围绕Java内存模型进行包装是很困难的。如果你还没有确定在另一次读或写之前发生了读或写,那么最终的排序是不确定的。

答案 1 :(得分:0)

这是一个棘手的问题,因为它涉及很多并发主题。

首先我要开始,http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html

  

线程主要通过共享对字段的访问和参考字段引用的对象进行通信。这种通信形式非常有效,但可能会出现两种错误:线程干扰和内存一致性错误。防止这些错误所需的工具是同步

     

一个。 线程干扰描述了当多个线程访问共享数据时如何引入错误。

     

B中。 内存一致性错误描述了由于共享内存视图不一致而导致的错误。

因此,要直接回答主要问题,当您认为可能以引入线程干扰内存一致性错误的方式访问您的阵列时,可以同步数组。

你最终得到的是Race Condition。是否会使您的应用程序崩溃取决于您的应用程序。

因此,如果您不同步对多个线程之间共享的数组的访问,则会运行线程交错对此数组进行修改的机会(即线程干扰)。或线程读取数组中不一致数据的可能性(即内​​存一致性)。

解决方案通常是同步数组,或者我们为并发构建的Collection,例如https://docs.oracle.com/javase/tutorial/essential/concurrency/collections.html

中描述的那些