Страницы

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

вторник, 29 января 2019 г.

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

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


Ответ

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

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

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