Позвольте мне представить следующий сценарий.
У меня есть t потоков, выполняющих операций чтения в массиве A , который содержит n точек (размером d ), каждый поток получает интервал [i, j] точек, такой что: j - i = n / t.Эти потоки также выполняют операции записи для одного или нескольких наборов S (каждый набор содержит список и точку измерения d).Добавление точки в набор будет означать добавление ее в список и увеличение ее точки на заданную.
Задача потока состоит в добавлении каждой точки (полученной) в определенный набор в соответствии с некоторыми условиями.
На основании имеющихся в моем распоряжении инструментов (см. [1] ), я вижу два способа сделать это.
Любой (с p: точка и s: набор),
- Я блокирую s.list, добавляю p, разблокирую s.list.
- Я блокирую s.point, устанавливаю s.point на сумму p с помощьюs.point, разблокировать s.point.
или (с учетом 1. - 2. - ... как задача ),
- Пока еще есть задача сделать.
- Я пытаюсь заблокировать s.list.
- Если да, добавьте p, разблокируйте s.list.
- Если нет, добавьте 1. к задаче.
- Я пытаюсь заблокировать s.point [0]
- Если да, установите s.point [0] равным сумме p [0] с s.point [0], разблокируйте s.point [0].
- Если нет, добавьте 2. к задаче.
- Я пытаюсь заблокировать s.point [1]
- Если да, установите s.point [1] на суммуиз p [1] с s.point [1], разблокировать s.point [1].
- Если нет, добавьте 2. к задаче.
- ...
- Я пытаюсь заблокировать s.point [d-1]
- Если да, установите s.point [d-1] равным сумме p [d-1] с помощью s.точка [d-1], разблокировка s.point [d-1].
- Если нет, добавьте D. в задачу.
Стоит ли использовать второе решение?Почему (если нет)?
[1] Обратите внимание, что я могу использовать только недекриминированные методы класса Thread
, синхронизированных средств ожидания-уведомления и класса ReentrantLock
,Использование любого другого класса из util.concurrent.*
запрещено, как и повторная реализация .