美文网首页
单例模式之懒汉式(多线程安全复现)

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

作者: 谜00016 | 来源:发表于2019-02-20 10:17 被阅读6次

懒汉式单单线程下的实现

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

相关文章

  • 单例模式Java篇

    单例设计模式- 饿汉式 单例设计模式 - 懒汉式 单例设计模式 - 懒汉式 - 多线程并发 单例设计模式 - 懒汉...

  • 单例(Singleton)

    单例设计模式 单例模式的创建 饿汉式1 饿汉式2 懒汉式 优化后的懒汉式(线程安全): 饿汉式与懒汉式区别 单例模...

  • Singleton 单例模式

    饿汉式单例模式 饿汉式单例模式 通过静态代码块增加异常处理 懒汉式单例模式 存在线程安全问题 懒汉式单例模式 解决...

  • kotlin实现单例模式

    1.懒汉式实现单例模式 2.线程安全懒汉式实现单例模式 3.双重校验懒汉式实现单例模式 4.静态内部类方式实现单例模式

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

    懒汉式单单线程下的实现 上述代码在单线程条件下是没有问题的,但是在多线程下是无法保证线程安全的。让我们使用一个实用...

  • Kotlin 的单例模式

    Kotlin 的单例模式(5种) Kotlin 的5种单例模式: 饿汉式 懒汉式 线程安全的懒汉式 双重校验锁式 ...

  • 有关单例模式懒汉式的安全问题

    有关单例模式懒汉式安全的问题(全) 单例模式有两种一种是懒汉式,一种...

  • 大话设计模式之_单例模式

    大话设计模式之___单例模式 什么是单例模式单例模式有哪些(会顺带讲些懒汉式的性能优化)懒汉式与饿汉式的区别 什么...

  • Java16-3 单例设计模式下的多线程访问

    当一个单例设计模式被多线程并发访问时,也会出现安全问题。 懒汉式单例设计模式(推荐使用) 不会因为同步而出现安全问...

  • 设计模式 ~ 单例模式

    七种常见的单例模式 1、懒汉式 特点:获取单例时判空即可,线程不安全 2、线程安全的懒汉式 特点:在获取单例的方法...

网友评论

      本文标题:单例模式之懒汉式(多线程安全复现)

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