Советы по параллелизму JAVA - PullRequest
0 голосов
/ 14 ноября 2018

Я немного новичок в параллелизме (я думаю, я хорошо справляюсь с мониторами, семафорами и reentrantLocks), поэтому я не могу их использовать. Я должен использовать любой класс или интерфейс из параллельного пакета.

Точка 1. Немногие потоки должны получить доступ к массиву и составить список его элементов (здесь я использовал атомарные переменные, в качестве указателя на массив используется атомная переменная).

Пункт 2. Здесь несколько нитей (машин) на берегу должны пересечь реку. Есть Нить, которая имитирует лодку. Когда в лодке 10 машин, она отправляется на другой берег. Эта последовательность повторяется до тех пор, пока все автомобили не пересекают реку. Я действительно не знаю, какие из них использовать здесь.

Пункт 3.- Здесь некоторые потоки должны прочитать некоторую информацию, а другие потоки должны изменить эту информацию (любое количество раз). Я считаю, что здесь я должен использовать ReadWriteLock.

Точка 4.- Проблема, подобная производителю / потребителю. Здесь я использовал BlockingQueue.

Точка 5.- Сформировать проблему, подобную обменнику, и решить ее (сделано, действительно просто ... 2 потока, обменивающихся строковой переменной).

Если у вас есть рекомендации относительно того, какой метод использовать в определенных точках (например, «Нет, используйте атомарные переменные в точке 3 и циклический барьер в точке 1»), это мне очень поможет!

Спасибо!

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Пункт 2: если нить представляет собой лодку, она должна взять машины на одном берегу реки и разгрузить их на другом берегу.Похоже, что наиболее естественным представлением автомобилей на берегу является BlockingQueue и ArrayList для автомобилей на лодке.Как правило, всегда сначала обращайте внимание на BlockingQueue.

Точка 3: обычно это выполняется синхронизированными методами или ReentrantLocks .

0 голосов
/ 14 ноября 2018

Атомные переменные

Атомарные переменные обрабатываются алгоритмом CAS и могут безопасно использоваться несколькими потоками:

CAS:

Типичная операция CAS работает с тремя операндами: Место памяти, на котором можно работать (M) Существующее ожидаемое значение (A) переменной Новое значение (B), которое необходимо установить Операция CAS атомарно обновляет значение в M до B, но только если существующее значение в M соответствует A, в противном случае никаких действий не предпринимается.

Вы можете использовать обменник, который можно использовать для обмена, обмена информация между двумя потоками

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Exchanger.html

Очередь блокировки - это модель производителя-потребителя, о которой вы упомянули. используя его, вам нужно создать два потока, один будет продюсер, он будет положить в очередь блокировки, потребитель будет потреблять (читать) из нее. Существует множество реализаций BlockingQueue
Вот больше подробная информация:

http://tutorials.jenkov.com/java-util-concurrent/blockingqueue.html

Так что из вашего списка все на своих местах.

Также вы можете прочитать здесь кое-что о java.util.concurrent. Я думаю, что это будет полезно:

http://tutorials.jenkov.com/java-util-concurrent/index.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...