Other |
---|
tbdUnresolved |
Duplicate :
|
|
Duplicate :
|
|
Relates :
|
|
Relates :
|
|
Relates :
|
ReentrantLock's javadoc suggests the following usage pattern: {code:java} * lock.lock(); // block until condition holds * try { * // ... method body * } finally { * lock.unlock() * } {code} Unfortunately, {{StackOverflowError}} might result in lock being **locked** when users follow the recommendations. The attached testcase reproduces the issue. {noformat} % java LockVsStackOverflow Initial lock.isLocked() state = false OpenJDK 64-Bit Server VM warning: Potentially dangerous stack overflow in ReservedStackAccess annotated method LockVsStackOverflow.doSmth()V [1] FAIL: lock is LOCKED in finally, however it must be unlocked since the code did use try-finally Exception in thread "main" java.lang.StackOverflowError at java.base/java.util.concurrent.locks.ReentrantLock$Sync.tryRelease(ReentrantLock.java:173) at java.base/java.util.concurrent.locks.AbstractQueuedSynchronizer.release(AbstractQueuedSynchronizer.java:1059) at java.base/java.util.concurrent.locks.ReentrantLock.unlock(ReentrantLock.java:494) at LockVsStackOverflow.doSmth(LockVsStackOverflow.java:30) at LockVsStackOverflow.doSmth(LockVsStackOverflow.java:28) ... {noformat} Note: "FAIL: lock is LOCKED in finally" in the output. I tested with {noformat} % java -version openjdk version "21-ea" 2023-09-19 OpenJDK Runtime Environment (build 21-ea+30-2426) OpenJDK 64-Bit Server VM (build 21-ea+30-2426, mixed mode, sharing) {noformat}
|