加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java数组同步

发布时间:2020-12-15 08:38:20 所属栏目:Java 来源:网络整理
导读:我有一种异步任务管理类,它有一个这样的数组: public static int[][][] tasks; 大多数情况下,我访问这样的单元格: synchronized(tasks[A][B]) { // Doing something with tasks[A][B][0]} 我的问题是,如果我这样做: synchronized(tasks[A]) { // ...} 它
我有一种异步任务管理类,它有一个这样的数组:

public static int[][][] tasks;

大多数情况下,我访问这样的单元格:

synchronized(tasks[A][B]) {
  // Doing something with tasks[A][B][0]
}

我的问题是,如果我这样做:

synchronized(tasks[A]) {
  // ...
}

它还会阻止尝试进入同步的线程(任务[A] [B])吗?
换句话说,对阵列的同步访问是否同步了它的单元格?
如果没有,我如何为我的线程阻止任务[A]的整个数组?
编辑:答案是否定的.当有人在任务[A]中处于同步块时,其他人可以同时处于任务[A] [B]的同步块中 – 因为它是一个不同的对象.因此,当谈论一次从一个地方访问对象时,数组也不例外:从一个地方一次触摸对象X需要通过synchronized(X)环绕它,无论你触摸它.

解决方法

int [] [] []是一个整数数组数组,因此你的synchronized(tasks [A] [B])正在同步最低级别的对象,一个整数数组,阻止对同一个数组的其他同步访问.

另一方面,synchronized(任务[A])正在同步下一级别的对象 – 整数数组的数组.这可以防止对该数组的同步访问,这意味着,实际上任何其他使用synchronized(任务[A])的代码都将被阻止 – 这似乎就是你想要的,只要你对任务的所有访问同时进行同步水平.

请注意,同步不会锁定任何东西!但是,如果两个线程尝试在同一个对象上进行同步,则必须等待.

然后你处理另一个对象(你的整数数组)并不重要.

我担心我说andersoj的回答是误导性的.你正在做正确的事.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读