#java #performance #exception #jvm
#java #Производительность #исключение #jvm
Вопрос:
Я изучаю исходный код AbstractQueuedSynchronizer
JDK8, и я не знаю цели «нулевой проверки» здесь:
/**
* Returns previous node, or throws NullPointerException if null.
* Use when predecessor cannot be null. The null check could
* be elided, but is present to help the VM.
*
* @return the predecessor of this node
*/
final Node predecessor() throws NullPointerException {
Node p = prev;
if (p == null)
throw new NullPointerException();
else
return p;
}
В примечаниях говорится, что проверка null может быть отменена, но присутствует, чтобы помочь виртуальной машине — почему? В чем выгода для виртуальной машины?
Комментарии:
1. Понятия не имею, но предполагаю: возможно, это помогает компилятору just in time работать лучше. Но почему именно это может (если вообще может) сказать человек, который действительно знает внутренности jvm…
2. Я отредактировал ваш вопрос и добавил несколько тегов. Надеюсь, кто-то, кто знает подробности, увидит это.
3. Код и комментарий были написаны давно; вероятно, это не актуально для текущей JVM. Я полагаю, идея заключалась в том, чтобы вручную установить проверку null, чтобы JVM могла обрабатывать все последующие использования переменной как всегда ненулевые и устранять неявные проверки null при доступе к полям узла.
Ответ №1:
С точки зрения дизайна, когда вы пишете API, полезно передать ответственность за обработку неопределенного поведения пользователю, а не пытаться справиться с этим самостоятельно.
В комментариях говорится, что вы должны использовать только predecessor()
тогда, когда этого не может быть null
, поэтому он проверяет, чтобы убедиться, что это не так null
, но если это так, то поведение не определено, и вы должны уведомить пользователя.
Возможно, есть что-то специфичное для JVM, для чего это полезно, но кто-то, кто лучше разбирается в этом, должен будет поговорить с этим.
Комментарии:
1. большое спасибо. Но я до сих пор не знаю преимущества для виртуальной машины.