1.4でダブルチェックの問題が 発生しましたhttp://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html 後のJDKで修正されましたか?
質問する
818 次
2 に答える
8
単純なグーグルはそれを示します
- 特定の方法で使用された場合、Java 5で修正されました(Markoの回答を参照)
- それはまだ良い考えではありません。多くの場合、単純な
enum
方が優れたソリューションです。
書く代わりに
public final class Singleton {
// Double-check idiom for lazy initialization of instance fields.
private static volatile Singleton instance;
private Singleton() {
}
public static Singleton getInstance() {
Singleton result = instance;
if (result == null) { // First check (no locking)
synchronized (Singleton.class) {
result = instance;
if (result == null) // Second check (with locking)
instance = result = new Singleton();
}
}
return result;
}
}
あなたはただ書くことができます
public enum Singleton {
// Thread safe lazy initialization of instance field.
INSTANCE
}
于 2012-11-19T10:03:36.660 に答える
4
いいえ、修正されておらず、修正されません。Java 5は、このイディオムが破られていることを明確に指定し、それが最終的な評決です。インスタンスフィールドを遅延初期化する適切な方法には、同様にイディオムと呼ばれる別のイディオムが含まれます。ダブルチェックイディオム:
// Double-check idiom for lazy initialization of instance fields.
private volatile FieldType field;
FieldType getField() {
FieldType result = field;
if (result == null) { // First check (no locking)
synchronized(this) {
result = field;
if (result == null) // Second check (with locking)
field = result = computeFieldValue();
}
}
return result;
}
参照:Josh Bloch、EffectiveJava。JoshBlochとのこのOracletechnetworkインタビューも参照してください。
于 2012-11-19T10:11:17.553 に答える