public static void main(String[] args) {
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
System.out.println("Locking");
synchronized (Object.class) {
System.out.println("Locked");
}
}
});
synchronized (Object.class) {
System.exit(0);
}
}
На самом деле, эта головоломка позволяет понять, почему зависает следующая программа:
public static void main(String[] args) {
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
System.exit(0);
}
});
System.exit(0);
}
Вот тут человек пытается объяснить проблему разрывом парности monitorenter/monitorexit, но мне кажется, что ответ на поверхности: срабатывает обычная блокировка, так как shutdown hook выполняется на отдельном потоке. Это даже из API видно, что это не просто Runnable, а целый Thread. А второй пример говорит нам о том, что внутри System.exit есть своя блокировка, которая и подвешивает JVM.
Комментариев нет:
Отправить комментарий