ReadWriteLock - внутри один объект блокировки или два?

Рейтинг: 0Ответов: 2Опубликовано: 04.08.2023

У класса ReentrantReadWriteLock есть два метода на получение блокировки - readLock и writeLock. Между ними установлены некоторые правила взаимоотношений, по которым блокировка становится возможной.

Собственно такой вопрос - внутри класса получение этих двух блокировок будет сводиться к одному объекту блокировки, или там будут отдельный объект для блокировки на чтение и отдельный для блокировки на запись?

Может быть я неправильно понимаю и там вообще используется другой внутренний механизм без явных объектов блокировки? Документация говорит что

A ReadWriteLock maintains a pair of associated locks, one for read-only operations and one for writing

Но не очень понятно как это трактовать.

Ответы

▲ 0Принят

Объекта два, это следует прямо из интерфейса:

Lock  readLock()   Returns the lock used for reading.
Lock  writeLock()  Returns the lock used for writing.
▲ 0

Давай по порядку. ReentrantReadWriteLock стоит использовать, когда множество потоков имеют какие-то общие данные, которые могут быть изменены потоками в процессе работы, что в свою очередь может привести к состоянию гонки.

Он позволяет множеству потоков одновременно считывать данные, и при этом только одному потоку записывать данные. Метод readLock().lock(); позволяет множеству потоков владеть одной и той же блокировкой и тем самым беспрепятственно считывать общие данные. Но как только блокировка освобождается и какой-то из потоков вызывает метод writeLock().lock();, то все потоки, которые захотят считывать данные, будут заблокированы методом readLock().lock(); , до освобождения блокировки методомwriteLock().unlock();. И конечно, все эти методы должны вызываться через один и тот же объект ReentrantReadWriteLock.

Мне кажется очевидно, что нет смысла использовать ReentrantReadWriteLock только для чтения данных, если ни один из потоков их не изменяет.