两个数组访问的Java竞争条件

两个数组访问的Java竞争条件,java,arrays,multithreading,queue,synchronized,Java,Arrays,Multithreading,Queue,Synchronized,让我介绍一下下面的场景 我有t线程在一个数组A上执行读取操作,该数组包含n点(维度d的),每个线程接收一个间隔[I,j]的点,即:j-I=n/t。这些线程还对一个或多个集合执行写入操作(每个集合包含一个列表和一个d维点)。在集合中添加点意味着将其添加到列表中,并按给定值递增其点 线程作业是根据某些条件在特定集合中添加每个点(它接收到) 根据我掌握的工具(请参见[1]),我看到了两种方法 或者(p:a点和s:a集) 我锁定s.list,添加p,解锁s.list 我锁定s点,将s点设置为p与s点之和

让我介绍一下下面的场景

我有t线程在一个数组A上执行读取操作,该数组包含n点(维度d的),每个线程接收一个间隔[I,j]的点,即:j-I=n/t。这些线程还对一个或多个集合执行写入操作(每个集合包含一个列表和一个d维点)。在集合中添加点意味着将其添加到列表中,并按给定值递增其点

线程作业是根据某些条件在特定集合中添加每个点(它接收到)

根据我掌握的工具(请参见[1]),我看到了两种方法

或者(p:a点和s:a集)

  • 我锁定s.list,添加p,解锁s.list
  • 我锁定s点,将s点设置为p与s点之和,解锁s点

  • 或者(将1.-2.-…视为一项任务)

    • 虽然还有任务要做。
    • 我试图锁定s.list。
      • 如果是,添加p,解锁s列表
      • 如果否,则添加1。责难
    • 我尝试锁定s点[0]
      • 如果是,将s.point[0]设置为p[0]与s.point[0]之和,解锁s.point[0]
      • 如果没有,则添加2。责难
    • 我尝试锁定s点[1]
      • 如果是,将s.point[1]设置为p[1]与s.point[1]之和,解锁s.point[1]
      • 如果没有,则添加2。责难
    • 我试图锁定s点[d-1]
      • 如果是,将s点[d-1]设置为p[d-1]与s点[d-1]之和,解锁s点[d-1]
      • 如果否,则将D.添加到任务中
    使用第二种解决方案值得吗?为什么(如果不是)


    [1]请注意,我只能使用
    线程
    类、同步等待通知功能和
    重入锁定
    类的非擦洗方法。禁止使用
    util.concurrent.*
    中的任何其他类,重新实现也是如此。

    您是否查看了并发集合而不是锁定,例如使用
    ConcurrentLinkedQue
    而不是
    ArrayList
    ,和<代码> AtomicInteger <代码>求和吗?真抱歉,我忘了加上我对使用库的限制,请考虑我添加的最后一点。否则原子学将是我最好的解决方案。您的场景描述不完整或非常混乱。首先,您说线程只对数组的一部分执行读取操作,但是突然您开始谈论插入。仅仅使用您的描述很难可视化您的数据结构和对它们的操作。我已经更新了我的场景,希望现在更清晰一些。