Недавно я узнал о существовании StampedLock
?
https://docs.oracle.com/javase/10/docs/api/java/util/concurrent/locks/StampedLock.html Я понял, что это улучшенный ReentrantReadWriteLock с некоторыми отличиями:
- Не реентерабельный
- Поддерживает оптимистическую блокировку
- Поддерживает обновление с readLock на writeLock
Также я читаю примеры frpm javadoc, но не понимаю этот код:
class Point {
private double x, y;
private final StampedLock sl = new StampedLock();
// a read-only method
// upgrade from optimistic read to read lock
double distanceFromOrigin() {
long stamp = sl.tryOptimisticRead();
try {
retryHoldingLock: for (;; stamp = sl.readLock()) {
if (stamp == 0L)
continue retryHoldingLock;
// possibly racy reads
double currentX = x;
double currentY = y;
if (!sl.validate(stamp))
continue retryHoldingLock;
return Math.hypot(currentX, currentY);
}
} finally {
if (StampedLock.isReadLockStamp(stamp))
sl.unlockRead(stamp);
}
}
}
Что это значит possibly racy reads
? [ОТВЕЧАЕМ В КОММЕНТАРИЯХ]
Это проблема, если другой поток читает x
или y
? [ОТВЕЧАЕМ В КОММЕНТАРИЯХ]
почему мы сначала выполняем tryOptimisticRead, а readLock в цикле for в случае сбоя tryOptimisticRead? какая логика?
Почему у нас есть if (StampedLock.isReadLockStamp(stamp))
внутри finally block vbefore unlock ?