Подтвердить что ты не робот

Двойная проверка блокировки в Android

По мнению многих, некоторая общая идиома Double-Checked Locking нарушена для java, если вы не используете 1.5 или новее и используете ключевое слово volatile.

Сломанный дважды проверенный образец блокировки:

// Broken multithreaded version
// "Double-Checked Locking" idiom
class Foo { 
  private Helper helper = null;
  public Helper getHelper() {
    if (helper == null) 
      synchronized(this) {
        if (helper == null) 
          helper = new Helper();
      }    
    return helper;
    }
  // other functions and members...
  }

Образец приходит из этой статьи, в которой также содержится подробная информация о том, как ее исправить: http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html

Анализ Pugh выше для виртуальных машин Java. Я работаю на Android и часто использую библиотеки, которые используют Double-Checked Locking. Поддерживает ли модель памяти dalvik VM эту идиому?

4b9b3361

Ответ 1

Ответ на этот question подразумевает, что модели памяти должны быть одинаковыми, и что будет работать новая двойная проверенная блокировка idiom.

Ответ 2

Я нашел очень хорошую статью об этом вопросе: http://www.javamex.com/tutorials/double_checked_locking_fixing.shtml

В нем четко указаны 3 способа исправить DCL. И похоже, что в вашем вопросе поле помощника должно быть объявлено изменчивым, иначе оно не будет работать.

Когда дело доходит до использования, то есть RoboGucie в вашем случае, я думаю, что поддержал бы метод загрузчика класса, упомянутый в статье. Это более ясное для меня и как эффективное.