2011-04-19 5 views
18

多くの人によると、1.5以降を実行していない限り、volatileというキーワードを使用しない限り、多かれ少なかれ一般的なダブルチェックロックのイディオムがJava用に壊れています。Androidでダブルチェックロック

壊れたダブルチェックロックのサンプル:

// 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で動作し、Double-Checked Lockingを使用するライブラリを頻繁に使用します。 dalvik VMのメモリモデルはこのイディオムをサポートしていますか?

+0

おそらく私が見ていたところで推測することができます;) – Snicolas

答えて

10

この回答はquestionであり、メモリモデルは同じでなければならず、新しいダブルチェックロックイディオムが機能することを意味しています。

+1

はい。 "volatile"キーワードを追加すると、これはユニプロセッサ(すべてのバージョンのAndroid)とSMP(3.0 "honeycomb"以降)で動作します。 – fadden

+0

そうでなければ、ハニカムの前に、非揮発性フィールドでの二重ロックチェックが可能ですか? @Fadden BTW、dalvik java.lang.Classクラスにリフレクション・コール・キャッシングがありますか?キャッシュすることによって、私は、java VMのようないくつかのバイトコード生成があることを意味します:stackoverflow.com/a/414823/693752 – Snicolas

+1

Pughのに示されているように、ある種の同期操作( 'volatile'、' synchronized'など)サイト。問題の壊れた例は、壊れているので、使用しないでください。 Dalvikでのリフレクションの実装は、時間の経過とともにかなり変化しています。したがって、特定のリリースのコードを見て、それが何をしているのかを正確に知る必要があります。私はいくつかのキャッシュがあると信じていますが、私の知識の中でバイトコードの生成は、使用されているテクニックの1つではありません。 – fadden

0

私はその質問については非常に良い記事を見つけた: http://www.javamex.com/tutorials/double_checked_locking_fixing.shtml

それは明らかにDCLを修正するための3つの方法を述べています。あなたの質問のように見える、ヘルパーフィールドは、揮発性宣言する必要がありますそれ以外の場合は動作しません。

ご使用の場合、RoboGucieの場合は、記事に記載されているクラスローダーメソッドが好きです。それは私にはより明確で効率的です。

関連する問題