среда, 7 декабря 2011 г.

System.exit and locks

Обнаружил тут головоломку: что напечатает следующая программа?
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.

Комментариев нет:

Отправить комментарий