Не могли бы вы сделать ReadWriteLock, используя только AtomicInteger для блокировки? - PullRequest
0 голосов
/ 08 сентября 2018

Если бы вы использовали битовые маски для хранения блокировки чтения и записи в одном AtomicInteger, могли бы вы реализовать быстрый класс ReadWriteLock?

Чем бы он отличался от обычного ReentrantReadWriteLock?

1 Ответ

0 голосов
/ 08 сентября 2018

TL; DR - не сработает.

  1. Как указывает @Radiodef, вы не сможете реализовать ReadWriteLock API. Такие методы, как getOwner, getQueuedThreads и т. Д., Не могут быть реализованы, если состояние блокировки - всего один AtomicInteger.

  2. Полный возврат был бы невозможен. Для повторного входа обычно требуется, чтобы вы закодировали идентификаторы потоков, в настоящее время удерживающих блокировку, и количество повторных входов для каждого из них. Для читателей мы могли бы использовать один счет (и не идентифицировать), но одному писателю нужны и идентификатор, и счет. Подсчет количества и идентификатора потока в 32-битное целое число, вероятно, не сработает. (A Thread предлагает числовой атрибут id, который является уникальным и неизменным для времени жизни потока ... но id является long.)

  3. Если вы используете только один AtomicInteger в качестве состояния блокировки, вы не можете парковать поток, ожидающий ожидаемой блокировки. (Для парковки, чтобы работать, поток, который снимает блокировку, должен знать, какой поток нужно распаковать. Но вы не можете это представить.) Это означает, что вам нужно будет использовать спин-блокировку 1 , которая стоит дорого и не масштабируемая.

Таким образом, вы не можете реализовать API ReadWriteLock или семантику полного повторного входа. Если вы удалите эти требования, вы могли бы возможно реализовать простые блокировки чтения-записи (реентерабельные для читателей, реентерабельные для писателей), но вам нужно было бы сделать спин-блокировку.


1 - При спин-блокировке поток, ожидающий условной блокировки, «вращается», выполняя цикл занятости, пока блокировка не станет доступной. Это нормально для блокировок, когда конкуренция маловероятна и недолговечна ... или когда ядро ​​больше ничего не может сделать. Но это слишком неэффективно для нормального использования.

...