多くの人によると、1.5 以降を実行していてvolatile
キーワードを使用しない限り、やや一般的な Double-Checked Locking イディオムは Java では壊れています。
壊れたダブルチェック ロックのサンプル:
// 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 VM に関するものです。私は Android で作業しており、Double-Checked Locking を使用するライブラリを頻繁に使用しています。dalvik VM のメモリ モデルはこのイディオムをサポートしていますか?