什么情况下需要同步Java中的一个数组?

Under what circumstances do you need to synchronize an array in Java?

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

我的想法是,访问需要同步吗?说两个线程同时访问数组,会崩溃吗?

如果一个人在编辑,一个人在阅读怎么办? (取值不同,不同情况下相同)

两者编辑的内容不同?

或者当您不同步时,是否没有像数组那样的 JVM 崩溃?

Under what circumstances do you need to synchronize an array?

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

My thoughts are, do you need to synchronize for access? Say two threads access the array at the same time, is that going to crash?

崩溃,不,但您的数据可能不一致,如果它们是 32 位架构上的 64 位数据,则​​更加不一致。

What if one edits, while one is reading? (separate values, and the same in different circumstances)

请不要。绕过 Java 内存模型已经够难的了。如果您尚未确定读取或写入发生在另一读取或写入之前,则最终顺序未定义。

这是一个难题,因为它涉及到很多并发主题。

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

Threads communicate primarily by sharing access to fields and the objects reference fields refer to. This form of communication is extremely efficient, but makes two kinds of errors possible: thread interference and memory consistency errors. The tool needed to prevent these errors is synchronization.

A. Thread Interference describes how errors are introduced when multiple threads access shared data.

B. Memory Consistency Errors describes errors that result from inconsistent views of shared memory.

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

你最终得到了所谓的 Race Condition。这是否会导致您的应用程序崩溃取决于您的应用程序。

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

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

中描述的那些