IllegalMonitorStateException in ReentrantLock$Sync.tryRelease on executor shutdown
Nobody has claimed this yet.
- Dominant language
- Java
- Stars
- 1.5k
- Forks
- 95
- Avg merge
- 1d 14m
- Merged PRs (30d)
- 6
Description
Working on JMH in #35 I have encountered an exception thrown on an executor service shutdown if ReactorThreadFactory is used with rejectBlocking: false (and daemon: false in that case):
OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
result
java.lang.IllegalMonitorStateException
at java.base/java.util.concurrent.locks.ReentrantLock$Sync.tryRelease(ReentrantLock.java:149)
at java.base/java.util.concurrent.locks.AbstractQueuedSynchronizer.release(AbstractQueuedSynchronizer.java:1302)
at java.base/java.util.concurrent.locks.ReentrantLock.unlock(ReentrantLock.java:439)
at java.base/java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:440)
at java.base/java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1054)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1114)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:834)
It occurs only with BlockHound installed. Sample code to produce that result:
public class ReproduceIllegalMonitorStateException {
public static void main(String[] args) throws ExecutionException, InterruptedException {
ThreadFactory blockingUnfriendlyThreadFactory = new ReactorThreadFactory("blocking-unfriendly", new AtomicLong(), false, true,
(t, e) -> e.printStackTrace());
ExecutorService executor = Executors.newSingleThreadExecutor(blockingUnfriendlyThreadFactory);;
try {
BlockHound.install();
System.out.println(executor.submit(() -> "result").get());
} finally {
executor.shutdown(); //fails with non daemon thread with "java.lang.IllegalMonitorStateException" on "ReentrantLock$Sync.tryRelease()"
}
}
}
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the sample using ReactorThreadFactory, BlockHound.install(), and executor.shutdown(), then inspect how BlockHound handles the executor's LinkedBlockingQueue.take() during shutdown. Reproduce the IllegalMonitorStateException with the non-daemon, rejectBlocking=false configuration and compare shutdown behavior. Done means the sample shuts down without the exception while blocking-call detection remains intact.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- java
- Domain
- devtools
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 42/100