1

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

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

4

2 回答 2

5

它在阵列本身的监视器上同步。

即使您可以对所有元素进行同步,也不能确保它们不被访问——因为同步只是建议性的。

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

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

于 2013-04-07T08:37:38.300 回答
0

Java 9 以不同的方式处理内存,并且有更多用于同步数组元素的选项。有关详细的技术说明,请参阅“使用 JDK 9 内存顺序模式” http://gee.cs.oswego.edu/dl/html/j9mm.html

如果此链接将来消失,请谷歌“java varhandle”了解更多信息。

于 2017-03-15T15:38:19.557 回答