Дает ли нулевая проверка SecurityManager большую производительность при выполнении doPrivs?
Я видел следующую схему много раз при выполнении операций, которые требуют особой привилегии (например, Class.getClassLoader()
)
final Class<?> clazz = MyClass.class;
if(System.getSecurityManager() == null) {
// Do the operation normally, since Java 2 Security is not enabled
return clazz.getClassLoader();
}
else {
// Use a doPriv, since Java 2 Security is enabled
return AccessController.doPrivileged(new PrivilegedAction<ClassLoader>() {
@Override
public ClassLoader run() {
return clazz.getClassLoader();
}
});
}
Я предполагаю, что преимущество здесь в том, что когда безопасность Java 2 не включена, код избегает создания анонимного внутреннего класса и избегает дополнительного вызова метода AccessController.doPrivilaged().
Итак, мой вопрос:
Является ли дополнительная нулевая проверка потенциально потенциально возможной, чтобы избежать создания анонимного PrivilagedAction
объект и дополнительный вызов doPriv в стеке?
Приведенный мною пример - всего лишь 1-строчный, но есть и более сложные процедуры, которые могут следовать этому шаблону, и я беспокоюсь, что поддержание двух наборов кода подвержено ошибкам.
Было бы замечательно, если бы JVM оптимизировала это автоматически, но я не знаю достаточно о внутренних принципах работы JVM, чтобы знать, если / как сильно ударить по производительности, это всегда использовать doPriv.