Скоро выходит продолжение фильма Гая Ричи:
Джуд Лоу - отличный Ватсон...
среда, 7 декабря 2011 г.
System.exit and locks
Обнаружил тут головоломку: что напечатает следующая программа?
На самом деле, эта головоломка позволяет понять, почему зависает следующая программа:
Вот тут человек пытается объяснить проблему разрывом парности monitorenter/monitorexit, но мне кажется, что ответ на поверхности: срабатывает обычная блокировка, так как shutdown hook выполняется на отдельном потоке. Это даже из API видно, что это не просто Runnable, а целый Thread. А второй пример говорит нам о том, что внутри System.exit есть своя блокировка, которая и подвешивает JVM.
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.
Подписаться на:
Сообщения (Atom)