Страницы

Поиск по вопросам

суббота, 4 января 2020 г.

Возможно ли комбинировать несколько способов синхронизации?

#java #многопоточность #синхронизация #concurrency


Здравствуйте.
Изучаю синхронизацию потоков в Java, и, как я понял из книги, существует несколько
способов синхронизации: через ключевое слово synchronized, через использование блокировок
ReentrantLock и через методы wait/notify.


Правильно ли я выделил эти способы?
Эти способы самодостаточны? Можно ли каждый из них использовать, не прибегая к остальным?
Комбинация этих способов невозможна/нежелательна/допустима/желательна?

    


Ответы

Ответ 1



Давайте по пунктам: Нет, не верно. пара методов wait()/notify() работают только в synchronized блоке. Следовательно, они не могут быть выделены в отдельную категорию. Для разграничения доступа к разделяемому ресурсу используют: synchronized блок, или метод. некоторые абстракции, в виде реализации интерфейса java.util.concurrent.Lock, различные семафоры, барьеры и пр. Их типы с избытком представлены в пакете java.util.concurrent. Впрочем, никто не запрещает написать какую нибудь свою реализацию. 2 и 3. Способы самодостаточны и их вполне, можно использовать не смешивая. Но как правило, в многопоточных программах, могут встретиться несколько типов синхронизации. Все сильно зависит от логики и условий использования. Приведу лишь несколько примеров: если к ресурсу обращаются не так часто и не много потоков, то производительнее будет использовать блокировку основанную на CAS'ах, т.к. это позволяет покрутившись в цикле избежав парковки треда, захватить ресурс, пускай и затратив некоторое процессорное время. если у ресурса есть два режима: чтение и запись и относительно мало потоков, которые в него пишут, то используется java.util.concurrent.ReadWriteLock. Это позволяет нескольким потокам-читателям заходить в критические области. Но если появляется писатель, то читатели ждут, когда завершится чтение.

Ответ 2



synchronized, wait, notify и notifyAll работают в связке - это примитивы. ReentrantLock - это высокоуровневая конструкция и реализована она через примитивы. Вы можете сами создать высокоуровневые конструкции из примитивов, но придется хорошо продумать архитектуру. Обычно используют высокоуровневые конструкции, а не приметивы, но вы можете их смешивать, если это необходимо.

Комментариев нет:

Отправить комментарий