Когда безопасно использовать метод readLock () класса ReentrantReadWriteLock? - PullRequest
1 голос
/ 16 марта 2011

Кажется довольно ясным, что использование readLock при чтении из файла (например) и использование writeLock при записи в него целесообразно. Однако, если у меня есть операция, где сравниваются два значения, например:

if (i == j) {
    System.out.println("equal);
}

Тогда можно ли использовать readLock () вместо writeLock для блокировки этого кода? Конечно, я ничего не пишу, но я сравниваю два значения, которые немного отличаются от простого чтения данных, так как в них включена операция. Имейте в виду, что «я» или «J» может измениться в любое время. Теоретически readLock () будет двигаться вперед только в том случае, если writeLock () не изменяет ресурс, но я не могу полностью понять все сложности этой проблемы. Просто кажется, что есть вероятность появления серой области, поэтому я подумал, что получу некоторую информацию.

Спасибо всем,

Мэтт

Ответы [ 2 ]

3 голосов
/ 16 марта 2011

Не думайте о блокировках чтения / записи с точки зрения чтения и записи, думайте о них как об эксклюзивных / общих.Блокировка записи является исключительной, блокировка чтения является общей.

Чтобы ответить на ваш вопрос, это зависит.

Скажем, у вас был 1 поток, обновляющий i, и один поток, обновляющий jи другой поток, который проверял на равенство.В этом случае записывающие потоки получат общую блокировку (чтение), поскольку они могут работать параллельно, поскольку каждый поток обновляет только 1 переменную.Поток сравнения может затем получить эксклюзивную блокировку (блокировку записи) для сравнения и выполнения действия, предотвращая любые обновления во время выполнения действия.ваше заявление.

0 голосов
/ 16 марта 2011

Хотя я думаю, что i и j как volatile и синхронизирующих доступ к модификации должно быть достаточно.

Но скажите, что вы должны использовать блокировки чтения-записи.В этом случае для вашего кода выше, вы должны иметь блокировку чтения.Причина в том, что данный код не является кодом модификации, он не изменяет i или j.Таким образом, другие методы могут действительно считывать значения i и j параллельно без какого-либо искажения.Вы должны использовать блокировку записи только в местах, которые изменяют значения i и j.

Редактировать: выделено «синхронизация доступа к модификации» для ответа на комментарии

...