почему мы сначала выполняем tryOptimisticRead и readLock в цикле for в случае сбоя tryOptimisticRead? в чем логика?
В лучшем случае мы сможем читать x
и y
без необходимости блокировки. Это не значит, что мы не устанавливаем отношения «происходит раньше», это просто означает, что нам не нужно вызывать возможное блокирующее действие.
tryOptimisticRead
возвращает нам значение штампа. Это volatile
чтение внутреннего состояния устанавливает, что все, что написано до изменчивой записи этого штампованного значения, будет видно после последующего чтения . Это означает, что если значение с меткой, возвращенное в tryOptimisticRead
, не изменяется, пока вы читаете x
и y
, то другой записи не произошло, и у нас есть самые последние значения. Однако, если значение с печатью действительно меняется, все ставки отменены, и вам необходимо защитить себя, как описано ниже.
Возможно, и, в зависимости от вашего варианта использования, вполне вероятно, что x
и y
будут меняться в какой-то момент на протяжении всего выполнения distanceFromOrigin
. Если x
и y
изменятся и, возможно, будут часто меняться, вы захотите в конечном итоге добиться успеха.
readLock
- это способ программы сказать: «Хорошо, я сдаюсь, давайте просто прочитаем его блокирующим образом». Теоретически, вы можете написать свой код в tryOptimisticRead
несколько раз, прежде чем в конечном итоге вызвать readLock
, но вы захотите выдать себя, если x
и y
будут постоянно обновляться.
Почему у нас, если (StampedLock.isReadLockStamp (stamp)) внутри блока finally перед разблокировкой?
Если вызывается readLock
, вам придется отпустить его до выхода, чтобы последующие writeLock
могли получить блокировку. Если вы преуспеете в tryOptimisticRead
, вам не нужно будет выпускать readLock
, так как вам вообще не нужно было его приобретать.