2015-11-27 3 views
0

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; 
     } 
    } 

DEMO

Он дал следующее объяснение с использованием локальной переменной:

Что эта переменная делает для убедитесь, что поле читается только один раз в общем случае, где это уже инициализирован.

Теперь давайте рассмотрим следующий код:

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; 
    } 
} 

DEMO

На моей машине, второй метод отложенной инициализации еще быстрее. Но на машине ideone они взяли приблизительно 7985 и 10630, как сказал Дж. Блох. Стоит ли использовать такие локальные переменные для оптимизации? Насколько я могу судить, затраты на чтение и запись переменных почти равны.

Таким образом, мы должны беспокоиться об этом, только если метод состоит в основном из такой легкой операции, верно?

ответ

1

Это своего рода оценка, потому что вы уже решили, что интенсивная загрузка и синхронизация слишком дороги. Но на самом деле это почти наверняка нет. Случаи, когда вам действительно нужен двойной код блокировки, как правило, находятся в неблокирующих структурах данных и вещах. Хорошие проекты для кода исполнителей, как правило, толкают его в изолированные места, чтобы вы не стреляли в ногу каждый раз, когда вы касались кода.

+0

Вы хотите подтолкнуть интиализацию в изолированное место? –

Смежные вопросы