如果我在数组上同步,这是否意味着我正在同步其中的所有元素,或者我正在同步数组对象?如果后者是真的,那么我如何一次同步数组中的所有元素,以便确保在执行某个块时不会访问非?
例如,假设我们有一个银行账户数组,我们希望确保在执行某个代码块时没有线程可以访问任何账户。
如果我在数组上同步,这是否意味着我正在同步其中的所有元素,或者我正在同步数组对象?如果后者是真的,那么我如何一次同步数组中的所有元素,以便确保在执行某个块时不会访问非?
例如,假设我们有一个银行账户数组,我们希望确保在执行某个代码块时没有线程可以访问任何账户。
它在阵列本身的监视器上同步。
即使您可以对所有元素进行同步,也不能确保它们不被访问——因为同步只是建议性的。
这里的解决方案可能是封装:根本不允许其他代码看到数组本身。这样您就可以通过您自己的方法(例如,像这样做)来控制其他代码如何访问数组的成员ArrayList
。
请注意,即使您执行了所有这些操作,它也不会阻止其他代码在您的独占代码开始运行之前获取数组元素,然后在您的独占代码运行时使用该引用(例如,改变它所引用的对象)。您并没有真正向我们提供有关您正在尝试做什么的太多信息,但您可能需要采取不同的方法。
Java 9 以不同的方式处理内存,并且有更多用于同步数组元素的选项。有关详细的技术说明,请参阅“使用 JDK 9 内存顺序模式” http://gee.cs.oswego.edu/dl/html/j9mm.html
如果此链接将来消失,请谷歌“java varhandle”了解更多信息。