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

懒汉式单单线程下的实现

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 概念 单例模式是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。本文就从单例模式的...
    Mr_Yangy阅读 4,260评论 0 1
  • 1、什么是单例模式 Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式、饿汉...
    团长plus阅读 3,693评论 0 0
  • 单例模式(Singleton Pattern)是众多设计模式中较为简单的一个,同时它也是面试时经常被提及的问题,如...
    廖少少阅读 3,690评论 0 1
  • 在所有的设计模式中,单例模式是我们在项目开发中最为常见的设计模式之一,而单例模式有很多种实现方式,你是否都了解呢?...
    耶律枣阅读 3,118评论 0 0
  • 写在前面 前段时间在回顾 Java 当中的 23(泛指并非只有23) 种设计模式,最近又在学习 Kotlin ,然...
    汪海游龙阅读 6,044评论 0 2