Что происходит, когда несколько потоков хотят получить доступ к ReentrantReadWriteLock?
Когда применяется reentrantReadWriteLock, и он заблокирован, что произойдет, если другой поток получит доступ к блокировке, пока он уже выполняет другой блок? (Таким образом, прежде чем он достигнет.unlock)
Метод отменен? Или, возможно, он остановился?:O
4 ответа
Так как вы сказали ReentrantReadWriteLock, поведение зависит от того, говорите ли вы о блокировке чтения или блокировке записи, связанной с ReadWriteLock.
- Если вы пытаетесь получить блокировку записи, вы будете заблокированы, пока все держатели не снимают блокировку (будь то блокировка чтения или блокировка записи)
- Если вы пытаетесь получить блокировку чтения, и у вас нет держателя блокировки записи, вы всегда сможете получить его, даже если есть другие держатели блокировки чтения.
- Если вы пытаетесь получить блокировку чтения, и есть держатель блокировки записи, вы будете заблокированы, пока держатель блокировки записи не снимет блокировку записи.
Блокировка чтения может удерживаться одновременно несколькими потоками, пока нет записи.
Поток будет блокироваться, пока блокировка не будет доступна. (документы)
Если вы хотите получить блокировку только при ее наличии, вы можете использовать tryLock()
Поток заблокируется. Если более чем один поток попытается получить эту блокировку, все они будут заблокированы. Когда блокировка снята, только один поток из пула ожидания получит блокировку, а остальные все еще будут ждать. Посмотрите на разницу между справедливыми и несправедливыми замками.
Если вы не хотите блокировать, вы можете использовать Lock.tryLock()
(который пытается без ожидания) или tryLock(long time, TimeUnit unit)
который будет ждать только столько времени, сколько вы укажете.