美文网首页
单例模式及其线程安全问题

单例模式及其线程安全问题

作者: writeanewworld | 来源:发表于2020-03-18 17:31 被阅读0次

1.单例模式?

即保证对一个类只实例化一个对象,比如spring的bean

2.单例模式的组成?

包括一个私有构造器,一个私有静态变量,一个公有的静态方法

3.单例模式线程安全问题?

如何在高并发下保证 线程安全+资源消耗少

4.饿汉式(线程安全)

/**
 * @Author waw
 * @Date 2020/3/18 17:01
 * @Version 1.0
 * @Description: 饿汉式单例模式
 */
public class EagerSingle {

    //私有的静态实例
    private static EagerSingle eagerSingleInstance = new EagerSingle();

    //私有的构造器
    private EagerSingle(){}

    //公有的静态方法
    public static EagerSingle getEagerSingle(){
        return eagerSingleInstance;
    }
}

优点:线程安全的
缺点:直接实例化,资源会浪费。
丢失了延迟实例化的性能好处

5.懒汉式(线程安全)

/**
 * @Author waw
 * @Date 2020/3/18 17:07
 * @Version 1.0
 * @Description:懒汉式单例模式
 */
public class LazySingle {
    
    //私有静态实例对象
    private static LazySingle lazySingleInstance;
    
    //私有构造器
    private LazySingle(){}
    
    //公有静态方法
    public static LazySingle getLazySingle(){
        if(null == lazySingleInstance){
            lazySingleInstance = new LazySingle();
        }
        return  lazySingleInstance;
    }
}

优点:一开始不进行实例化
缺点:非线程安全

6.线程安全的懒汉式单例

/**
 * @Author waw
 * @Date 2020/3/18 17:11
 * @Version 1.0
 * @Description: 线程安全的懒汉式单例模式
 */
public class SychLazySingle {
    
    //私有的静态实例
    private static SychLazySingle sychLazySingleInstance;
    
    //私有的构造器
    private SychLazySingle(){}
    
    //公有的静态方法
    public synchronized static SychLazySingle getSychLazySingleInstance(){
        if(null == sychLazySingleInstance){
            sychLazySingleInstance = new SychLazySingle();
        }
        return sychLazySingleInstance;
    }
}

优点:一开始不用创建实例、线程安全
缺点:高并发下多线程会存在线程阻塞问题
不推荐

7.双重校验锁

/**
 * @Author waw
 * @Date 2020/3/18 17:17
 * @Version 1.0
 * @Description: 双重校验锁
 */
public class DobSychSingle {
    
    //私有的静态实例
    private static DobSychSingle instance;
    
    //私有构造器
    private DobSychSingle(){}
    
    //公有静态方法
    public static DobSychSingle getInstance(){
        if(null == instance){
            synchronized (DobSychSingle.class){
                if(null == instance){
                    instance = new DobSychSingle();
                }
            }
        }
          return instance;
    }
}

优点: 一开始不用实例化、线程安全、
缺点:基本上没缺点,除了第一次实例化的时候可能会线程阻塞。

8.静态内部类实现

/**
 * @Author waw
 * @Date 2020/3/18 17:27
 * @Version 1.0
 * @Description:静态内部类实现
 */
public class StaticInerClassSingle {
    
    //私有的静态实例
    private static class innerClass{
        private static final StaticInerClassSingle INSTANCE = new StaticInerClassSingle();
    }
    
    //私有构造器
    private StaticInerClassSingle(){}
    
    //公有静态方法
    public static StaticInerClassSingle getInstance(){
        return innerClass.INSTANCE;
    }
}

内部静态类的变量不会在类加载的时候就初始化好,而是会在调用的时候才会初始化。保证了资源的节约、
具有延迟初始化的好处,而且由 JVM 提供了对线程安全的支持。

相关文章

  • 设计模式——单例模式的破坏

    概述: 之前学习了单例模式的几种实现,解决了多线程情况下,单例的线程安全问题,保证了单例的实现。但是单例模式在下面...

  • Singleton 单例模式

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

  • 单例模式及其线程安全问题

    1.单例模式? 即保证对一个类只实例化一个对象,比如spring的bean 2.单例模式的组成? 包括一个私有构造...

  • 单例模式之双重检查的演变

    前言 单例模式本身是很简单的,但是考虑到线程安全问题,简单的问题就变复杂了。这里讲解单例模式的双重检查。 单例模式...

  • 多线程Debug窥探单例模式

    1. 懒汉式单例模式 通过延迟初始化,降低单例创建期间的资源开销。 懒汉式单例实现,存在线程安全问题 线程任务 在...

  • 关于java静态内部类的思考

    前言 最近在看多线程,讲到单例模式安全问题的时候。提到了单例的第四种模式——InnerClass模式。里面提到这种...

  • 05.单例模式(创建型)

    创建型模式-单例模式 一、饿汉式单利模式 饿汉式不需要考虑线程安全问题。 饿汉式比较浪费资源 二、懒汉式单例模式 ...

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

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

  • 《设计模式》之单例模式

    定义: 单例模式:确保一个类只有一个实例,并提供一个全局访问点。 单例模式实在是太简单了,主要是注意线程安全问题;...

  • 源码 : 设计模式之单例模式的5种实现

    RelaxHeart网-王琦:源码 : 设计模式之单例模式的5种实现 方式一:饿汉式 方式二:懒汉式 线程安全问题...

网友评论

      本文标题:单例模式及其线程安全问题

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