Двойная проверка блокировки в Android - PullRequest
18 голосов
/ 19 апреля 2011

По мнению многих, несколько распространенная идиома двойной проверки блокировки не работает для 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

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

Ответы [ 2 ]

9 голосов
/ 19 апреля 2011

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

0 голосов
/ 19 февраля 2014

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

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

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

...