19

多くの人によると、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 のメモリ モデルはこのイディオムをサポートしていますか?

4

2 に答える 2

9

この質問に対する答えは、メモリ モデルが同じである必要があり、新しい二重チェック ロック イディオムが機能することを意味します。

于 2011-04-19T14:27:28.967 に答える