代码之家  ›  专栏  ›  技术社区  ›  errantlinguist

非空类成员字段的双重检查锁定

  •  0
  • errantlinguist  · 技术社区  · 7 年前

    double-checked locking 成语 Java null 如果是这样,则获取具有该字段的类的锁:

    // Double-check idiom for lazy initialization of instance fields
    // See Pascal Thivent's original answer <https://stackoverflow.com/a/3580658/1391325>
    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;
    }
    

    field null object “延迟替换为“非空对象”的值),可以在 this synchronized(field) ?

    实例

    我有一个很大的 HugeObject Reference<HugeObject> Reference<HugeObject> field = new SoftReference<>(null) 因此,使用不影响 领域 领域 。那么是否可以简单地在 此初始“空对象” 已经实例化的“非空对象”,或者这会导致微妙的、不想要的并发影响吗?见以下代码:

    private volatile Reference<HugeObject> field = new SoftReference<>(null);
    
    HugeObject getField() {
        HugeObject result = field.get();
        if (result == null) {
            synchronized(field) {
                result = field.get();
                if (result == null) {
                    result = computeFieldValue();
                    field = new SoftReference<>(result);
                }
            }
        }
        return result;
    }
    
    2 回复  |  直到 7 年前
        1
  •  4
  •   assylias    7 年前

    如果不想在上同步 this field 领域

    private final Object lock = new Object();
    
    //...
    
    synchronized(lock) { ... }
    
        2
  •  0
  •   Michael Andrews    7 年前

    您肯定不想锁定null可变成员。大多数人锁定 this 或者课堂上。但是如果您不想这样做,assylias的解决方案很适合您的用例。您还可以查看 java.util.concurrent.locks 包裹它提供了无需使用 synchronized ReentrantLock 对你有用吗?这个包还有一些很酷的东西,比如条件变量和旋转锁(不过可能不是您在这里使用的东西)。此外,我还写了一篇关于单例模式、双重检查锁定和“holder”模式的使用的文章,您可能对此感兴趣。 https://medium.com/@michael.andrews/deconstructing-the-singleton-b5f881f85f5