Пытаясь понять оптимистическую блокировку в Java 8, я наткнулся на приведенный ниже фрагмент кода. Исходный блог здесь .
Как объясняется в блоге, этот фрагмент кода пытается преобразовать блокировку чтения в блокировку записи. Код запрашивает явную блокировку записи, если преобразование блокировки чтения в блокировку записи не удалось.
Это меня озадачивает Как можно ожидать, что явная блокировка записи будет предоставлена, когда родительский поток уже удерживает блокировку чтения? Не похоже, что блокировка чтения снимается в любой момент до того, как принудительно запрошена блокировка записи. Насколько я понимаю, поток будет бесконечно ждать блокировки записи, поскольку блокировка чтения никогда не снимается, создавая взаимоблокировку.
Почему это не приводит к тупиковой ситуации здесь?
ExecutorService executor = Executors.newFixedThreadPool(2);
StampedLock lock = new StampedLock();
executor.submit(() -> {
long stamp = lock.readLock();
try {
if (count == 0) {
stamp = lock.tryConvertToWriteLock(stamp);
if (stamp == 0L) {
System.out.println("Could not convert to write lock");
stamp = lock.writeLock();
}
count = 23;
}
System.out.println(count);
} finally {
lock.unlock(stamp);
}
});
stop(executor);
Заранее спасибо!