Java 在阵列上同步。它是在所有元素上同步还是在数组对象上同步?

Java 在阵列上同步。它是在所有元素上同步还是在数组对象上同步?,java,synchronization,Java,Synchronization,如果我在一个数组上同步,这是否意味着我正在同步该数组中的所有元素,还是正在同步该数组对象?如果后者为真,那么如何一次同步数组中的所有元素,以便确保在执行某个块时访问non 例如。 假设我们有一个银行帐户数组,我们希望确保在执行某个代码块时,没有线程可以访问任何帐户。它在监视器上为数组本身进行同步 即使可以对所有元素进行同步,也不能确保它们不会被访问,因为同步只是一种建议 这里的解决方案可能是封装:根本不允许其他代码看到数组本身。这样,您就可以通过自己的方法(例如ArrayListdoes)控制其

如果我在一个数组上同步,这是否意味着我正在同步该数组中的所有元素,还是正在同步该数组对象?如果后者为真,那么如何一次同步数组中的所有元素,以便确保在执行某个块时访问non

例如。
假设我们有一个银行帐户数组,我们希望确保在执行某个代码块时,没有线程可以访问任何帐户。

它在监视器上为数组本身进行同步

即使可以对所有元素进行同步,也不能确保它们不会被访问,因为同步只是一种建议

这里的解决方案可能是封装:根本不允许其他代码看到数组本身。这样,您就可以通过自己的方法(例如
ArrayList
does)控制其他代码访问数组成员的方式


请注意,即使您执行了所有这些操作,它也不会阻止其他代码在独占代码开始运行之前获取数组元素,然后在独占代码运行时使用该引用(例如,修改它引用的对象)。您还没有向我们提供有关您尝试执行的操作的详细信息,但您可能需要采取不同的方法。

它会在监视器上为阵列本身进行同步

即使可以对所有元素进行同步,也不能确保它们不会被访问,因为同步只是一种建议

这里的解决方案可能是封装:根本不允许其他代码看到数组本身。这样,您就可以通过自己的方法(例如
ArrayList
does)控制其他代码访问数组成员的方式


请注意,即使您执行了所有这些操作,它也不会阻止其他代码在独占代码开始运行之前获取数组元素,然后在独占代码运行时使用该引用(例如,修改它引用的对象)。您并没有向我们提供有关您尝试执行的操作的详细信息,但您可能需要采取不同的方法。

Java 9以不同的方式处理内存,并且有更多的选项用于在数组元素上进行同步。有关详细的技术说明,请参阅“使用JDK 9内存顺序模式”


如果这个链接将来消失,谷歌“java varhandle”可以了解更多信息。

java 9以不同的方式处理内存,并且有更多的选项用于在数组元素上进行同步。有关详细的技术说明,请参阅“使用JDK 9内存顺序模式”

如果这个链接在将来消失,谷歌“JavaVarHandle”将了解更多信息