美文网首页Java 杂谈
双重检测锁的缺陷

双重检测锁的缺陷

作者: Bleoo | 来源:发表于2019-06-26 10:55 被阅读0次

双重检测锁实现的单例模式看起来非常完美,实则会出现同步问题。

public MyObject{
    private static MyObect instance;
    private Date d = new Data();
    public Data getD(){return this.d;}
    public static MyObect getInstance(){
        if(instance == null){
            synchronized(MyObect .class){ // 1
                if(instance == null) // 2
                    instance = new MyObject(); // 3
            }
        }
        return instance;
    }
}

1处会将线程进行同步。

2处会再次检查是否已经被其他线程实例化。

3处会出现JVM内存模型允许所谓的无序写入,如下

1: mem = allocate();        //Allocate memory for Singleton object.
2: instance = mem;          //Note that instance is now non-null, but
                         //has not been initialized.
3: ctorSingleton(instance); //Invoke constructor for Singleton passing

在2之后 instance 已经不为空。
若未执行3初始化,其他线程就已访问getD(),则d为空。
因为此时线程未离开synchronized块,所有instance所有的数据都未初始化且未同步。
这便是同步缺陷。

也可以使用贪婪方式,直接在类加载时初始化instance。

public MyObject{
    private static MyObect instance = new MyObject();
    private Date d = new Data();
    public Data getD(){return this.d;}
    public static getInstance(){
        return instance;
    }
}

Lazy-init的同步实现其实可以让jvm去实现。如下

public MyObject{

    private static class InstanceHoder{ //内部私有的类。
        static MyObject instance = new MyObject();
    }
    private Date d = new Data();
    public Data getD(){return this.d;}
    public static MyObect getInstance(){
           return InstanceHoder.instance;
    }
}

InstanceHoder内部类只有在使用到时候才会加载。

相关文章

  • 双重检测锁的缺陷

    双重检测锁实现的单例模式看起来非常完美,实则会出现同步问题。 1处会将线程进行同步。 2处会再次检查是否已经被其他...

  • java安全编码指南之:锁的双重检测

    简介 双重检测锁定模式是一种设计模式,我们通过首次检测锁定条件而不是实际获得锁从而减少获取锁的开销。 双重检查锁定...

  • 双重检测锁的替换方案

    原文来自:https://www.baeldung.com/java-singleton-double-check...

  • Android(Java)枚举单例

    常规方式 懒汉式 DCL「双重检测锁:Double Checked Lock」 优点:线程安全;延迟加载;效率较高...

  • 避免单例模式被反序列化和反射创建出新的实例

    双重检测锁的单例模式 使用反射获取实例测试 使用反序列化获取实例测试

  • 单例

    双重锁检测 new SingleInstance()指令1.加载到内存,分配内存地址2.执行对象初始化3.赋值vo...

  • 扩展篇之单例以及双重检测的缺陷

    定义:整个系统只允许存在一个实例首先 我们一般都这样 但这样在多线程时会存在问题多个线程同时运行到if (inst...

  • 单例模式

    双重锁 静态内部类

  • 单列模式的多种实现方式

    懒汉模式 饿汉模式 双重同步锁单例模式 volatile+双重同步锁单例模式 静态的工厂方法 枚举

  • JAVA单例模式

    java使用单例设计模式的方式有很多种,比如饿汉式,懒汉式,静态内部类式,双重检测锁式以及枚举方式,这里主要讲枚举...

网友评论

    本文标题:双重检测锁的缺陷

    本文链接:https://www.haomeiwen.com/subject/wbiqcctx.html