Java - условие гонки при доступе к двум массивам - PullRequest
0 голосов
/ 20 мая 2018

Позвольте мне представить следующий сценарий.

У меня есть t потоков, выполняющих операций чтения в массиве A , который содержит n точек (размером 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.

или (с учетом 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.точка [d-1], разблокировка s.point [d-1].
      • Если нет, добавьте D. в задачу.

Стоит ли использовать второе решение?Почему (если нет)?

[1] Обратите внимание, что я могу использовать только недекриминированные методы класса Thread, синхронизированных средств ожидания-уведомления и класса ReentrantLock,Использование любого другого класса из util.concurrent.* запрещено, как и повторная реализация .

...