Java单例---双重锁校验详解

简介: Java单例---双重锁校验详解

Java单例---双重锁校验详解

双重锁校验单例

什么是单例模式?

单例保证一个对象JVM中只能有一个实例

直接上代码吧:


/**
 * 双重锁校验的单例
 */
public class DoubleLock implements Serializable{
    public static volatile DoubleLock doubleLock = null;//volatile防止指令重排序,内存可见(缓存中的变化及时刷到主存,并且其他的内存失效,必须从主存获取)
    private DoubleLock(){
        //构造器必须私有  不然直接new就可以创建
    }
    public static DoubleLock getInstance(){
        //第一次判断,假设会有好多线程,如果doubleLock没有被实例化,那么就会到下一步获取锁,只有一个能获取到,
        //如果已经实例化,那么直接返回了,减少除了初始化时之外的所有锁获取等待过程
        if(doubleLock == null){
            synchronized (DoubleLock.class){
                //第二次判断是因为假设有两个线程A、B,两个同时通过了第一个if,然后A获取了锁,进入然后判断doubleLock是null,他就实例化了doubleLock,然后他出了锁,
                //这时候线程B经过等待A释放的锁,B获取锁了,如果没有第二个判断,那么他还是会去new DoubleLock(),再创建一个实例,所以为了防止这种情况,需要第二次判断
                if(doubleLock == null){
                    //下面这句代码其实分为三步:
                    //1.开辟内存分配给这个对象
                    //2.初始化对象
                    //3.将内存地址赋给虚拟机栈内存中的doubleLock变量
                    //注意上面这三步,第2步和第3步的顺序是随机的,这是计算机指令重排序的问题
                    //假设有两个线程,其中一个线程执行下面这行代码,如果第三步先执行了,就会把没有初始化的内存赋值给doubleLock
                    //然后恰好这时候有另一个线程执行了第一个判断if(doubleLock == null),然后就会发现doubleLock指向了一个内存地址
                    //这另一个线程就直接返回了这个没有初始化的内存,所以要防止第2步和第3步重排序
                    doubleLock = new DoubleLock();
                }
            }
        }
        return doubleLock;
    }
}

注释写的很清楚了,大家自己看哈

上面代码埋了一个坑,就是这个类实现类implements Serializable接口,这就会使这个类在序列化的时候单例被破坏,这个问题的解决方式和原理请看我的另一篇博客:java序列化破坏单例模式原理解析 个人浅薄理解,欢迎补充


相关文章
|
4天前
|
Java 数据安全/隐私保护
Java中的并发编程:锁与同步详解
Java中的并发编程:锁与同步详解
|
4天前
|
Java
Java中的锁机制及其应用
Java中的锁机制及其应用
|
8天前
|
设计模式 算法 Java
简单了解下Java中锁的概念和原理
Java的锁通过java代码实现,go语言的锁通过go实现,python语言的锁通过python实现。它们都实现的什么呢?这部分就是锁的定义和设计模式、算法、原理等一些理论上的东西。
10 1
|
9天前
|
存储 安全 算法
深入探索Java中的MarkWord与锁优化机制——无锁、偏向锁、自旋锁、重量级锁
深入探索Java中的MarkWord与锁优化机制——无锁、偏向锁、自旋锁、重量级锁
9 1
|
2天前
|
Java
java面试之线程八锁
java面试之线程八锁
7 0
|
2天前
|
存储 SQL 安全
Java共享问题 、synchronized 线程安全分析、Monitor、wait/notify以及锁分类
Java共享问题 、synchronized 线程安全分析、Monitor、wait/notify以及锁分类
11 0
|
2天前
|
Java 数据安全/隐私保护
Java中的并发编程:锁与同步详解
Java中的并发编程:锁与同步详解
|
2天前
|
Java
Java中的锁机制及其应用
Java中的锁机制及其应用
|
2天前
|
SQL Java 数据库连接
Java中的数据验证与输入校验策略
Java中的数据验证与输入校验策略
|
5天前
|
安全 Java
如何在Java中进行并发编程:锁与同步机制
如何在Java中进行并发编程:锁与同步机制