Java - 两个阵列上的竞争条件访问

时间:2018-05-20 13:45:20

标签: java arrays multithreading queue synchronized

让我介绍以下情况。

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

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

基于我可以使用的工具(请参阅 [1] )我看到了两种方法。

要么(p:一个点,一个s:一组),

  1. 我锁定s.list,添加p,解锁s.list。
  2. 我锁定s.point,将s.point设置为p与s.point的总和,解锁s.point。
  3. 或(考虑1. - 2. - ......作为任务),

    • 虽然还有任务要做。
      1. 我尝试锁定s.list。
        • 如果是,请添加p,解锁s.list。
        • 如果不是,请将1.添加到任务。
      2. 我试图锁定s.point [0]
        • 如果是,请将s.point [0]设置为p [0]与s.point [0]的总和,解锁s.point [0]。
        • 如果不是,请将2.添加到任务。
      3. 我试图锁定s.point [1]
        • 如果是,请将s.point [1]设置为p [1]与s.point [1]之和,解锁s.point [1]。
        • 如果不是,请将2.添加到任务。
      4. ...
      5. 我试图锁定s.point [d-1]
        • 如果是,请将s.point [d-1]设为p [d-1]与s.point [d-1]之和,解锁s.point [d-1]。
        • 如果不是,请将D.添加到任务。

    使用第二种解决方案是否值得?为什么(如果没有)?

    [1] 请注意,我只能使用Thread类,synchronized-wait-notify facitilities和ReentrantLock类的非depricated方法。禁止使用util.concurrent.*中的任何其他类,重新实现也是如此。

0 个答案:

没有答案