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