Java 7Стоимость чтения полей классов
Я чтения эффективной Java Дж Блоха и теперь я нахожусь в разделе об инициализации поля laziliy. Он introudce так называемый двойной проверки идиомы следующим образом:
public static void main(String[] args){
Test t = new Test();
long now = System.nanoTime();
t.getT();
long invokationTime = System.nanoTime() - now;
System.out.println(invokationTime); //Prints 3299 averagely
}
private static class Test{
private volatile Test field;
public Test getT(){
Test result = field; // <----- Note the local variable here
if(result != null){
synchronized (this) {
result = field;
if (result == null)
field = result = new Test();
}
}
return result;
}
}
Он дал следующее объяснение с использованием локальной переменной:
Что эта переменная делает для убедитесь, что поле читается только один раз в общем случае, где это уже инициализирован.
Теперь давайте рассмотрим следующий код:
public static void main(String[] args){
Test t = new Test();
long now = System.nanoTime();
t.getT();
long invokationTime = System.nanoTime() - now;
System.out.println(invokationTime); //Prints 3101 averagely
}
private static class Test{
private volatile Test field;
public Test getT(){
if(field != null){
synchronized (this) {
if (field == null)
field = new Test();
}
}
return field;
}
}
На моей машине, второй метод отложенной инициализации еще быстрее. Но на машине ideone они взяли приблизительно 7985 и 10630, как сказал Дж. Блох. Стоит ли использовать такие локальные переменные для оптимизации? Насколько я могу судить, затраты на чтение и запись переменных почти равны.
Таким образом, мы должны беспокоиться об этом, только если метод состоит в основном из такой легкой операции, верно?
Вы хотите подтолкнуть интиализацию в изолированное место? –