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()"
}
}
}
Working on JMH in #35 I have encountered an exception thrown on an executor service shutdown if
ReactorThreadFactoryis used withrejectBlocking: false(anddaemon: falsein that case):It occurs only with BlockHound installed. Sample code to produce that result: