单例模式之懒汉式(多线程安全复现)

懒汉式单单线程下的实现

package com.wangming.pattern.creational.singleton;

/**
 * @Auther: ming.wang
 * @Date: 2019/1/6 19:25
 * @Description:
 */

public class LazySingleton {
    private static LazySingleton lazySingleton=null;
    private LazySingleton() {
    }

    public static LazySingleton getInstance(){
        if (null==lazySingleton)
        {
            lazySingleton=new LazySingleton();
        }
        return lazySingleton;
    }
}

上述代码在单线程条件下是没有问题的,但是在多线程下是无法保证线程安全的。让我们使用一个实用技能多线程debug来复现一下这个问题。
让我们写一个测试类

package com.wangming.pattern.creational.singleton;

/**
 * @Auther: ming.wang
 * @Date: 2019/1/6 19:27
 * @Description:
 */
public class Test {
    public static void main(String[] args) {
//        LazySingleton lazySingleton = LazySingleton.getInstance();
        Thread t1 = new Thread(new T());
        Thread t2 = new Thread(new T());
        t1.start();
        t2.start();
        System.out.println("=========");
    }
}

class T implements Runnable {
    @Override
    public void run() {
        LazySingleton lazySingleton = LazySingleton.getInstance();
        System.out.println(Thread.currentThread().getName() + " " + lazySingleton);
    }
}

然后debug运行

那么问题出现了,我们改如何解决呢?其实很简单,只要在getInstance方法加上synchronized关键字

public class LazySingleton {
    private static LazySingleton lazySingleton=null;
    private LazySingleton() {
    }

    public synchronized static LazySingleton getInstance(){
        if (null==lazySingleton)
        {
            lazySingleton=new LazySingleton();
        }
        return lazySingleton;
    }

通过加synchronized关键字,这样就解决了懒汉式在多线程下的问题了。
我们知道同步锁是比较耗资源的,那么我们有没有优化的余地了呢?下篇文章,咱们一起分析一下。

你可能感兴趣的:(单例模式之懒汉式(多线程安全复现))