美文网首页
单例模式-多线程第二阶段课程

单例模式-多线程第二阶段课程

作者: jiahzhon | 来源:发表于2020-10-03 12:15 被阅读0次
  • 除了饿汉式和懒汉式,还有其他的比较优雅的实现方式。

  • 单例模式的多线程其实是由懒加载模式引起的。

  • 直接给获取实例的方法加锁,这样效率极其慢,直接串行化了。

public class Singleton1 {
    private static Singleton1 instance;
    
    private Singleton1() {
        
    }
    
    public synchronized static Singleton1 getInstance(){
        
        if (null == instance)
            instance = new Singleton1();
        
        return Singleton1.instance;
    }
}
  • double-check(两次是否为null判断)。减少锁的争取。但是这有一个比较难想到的bug。有可能会出现空指针异常。原因:在new instance执行完毕后,实例不为空了。但是可能上面的构造的函数运行慢,加载了外部很多的东西。而另一条线程因为判断不为空了,直接用实例中的东西,但因为构造函数并没有执行好,所以会抛出空指针异常。这里Singleton2要加上volatile才是完整版本,与有序性有关
public class Singleton2 {

    private static Singleton2 instance;

    private Singleton2(){
        //假设此时构造函数加载了很多东西,花费时间很长。
    }

    //double check
    public  static Singleton2 getInstance(){

        if(null == instance){
            synchronized (Singleton2.class) {
                if (null == instance)
                    instance = new Singleton2();
            }
        }
        
        return Singleton2.getInstance();
    }
}

三种比较优雅的实现方式

  • private static Singleton2 instance 在volatile关键字。这个关键字确保,你要读之前,前面的写操作一定要全部执行完。告诉JVM不要擅自优化。与happens-before有关。不过不让优化的代价就是速度慢
  • 静态内部类
public class Singleton3 {
    
    private Singleton3() {
        
    }
    
    private static class InstanceHolder {
        private final static Singleton3 instance = new Singleton3();
    }
    
    public static Singleton3 getInstance(){
        return InstanceHolder.instance;
    }
}
  • 借用枚举
public class Singleton4 {
    
    private Singleton4(){
        
    }
    
    private enum Singleton {
        INSTANCE;
        
        private final Singleton4 instance;
        
        Singleton() {
            instance = new Singleton4();
        }
        
        public Singleton4 getInstance() {
            return instance;
        }
    }
    
    public static Singleton4 getInstance() {
        return Singleton.INSTANCE.getInstance();
    }
}

相关文章

  • 单例模式Java篇

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

  • Java多线程--并行模式与算法

    Java多线程--并行模式与算法 单例模式 虽然单例模式和并行没有直接关系,但是我们经常会在多线程中使用到单例。单...

  • 单例模式

    单例模式介绍 把单例模式放到多线程基础这块,是因为单例和多线程有一点的关系。何为单例模式? 在它的核心结构中只包含...

  • 三、单例模式详解

    4.单例模式详解 4.1.课程目标 1、掌握单例模式的应用场景。 2、掌握IDEA环境下的多线程调试方式。 3、掌...

  • Unity3d游戏开发之-单例设计模式-多线程一

    单例模式3:多线程一

  • 单例模式

    单例模式 单例模式:用来保证一个对象只能被创建一次。 普通版 代码实现如下 同步锁单例 单例模式如果再多线程中使用...

  • 多线程(下)&GUI

    day25(多线程(下)&GUI) 1_多线程(单例设计模式)(掌握) 单例设计模式:保证类在内存中只有一个对象。...

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

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

  • iOS 多线程NSThread,GCD,NSOperation

    单例模式例子: https://github.com/XiaoRuiZuo/Singleton 多线程:多线程是为...

  • 单例模式-多线程第二阶段课程

    除了饿汉式和懒汉式,还有其他的比较优雅的实现方式。 单例模式的多线程其实是由懒加载模式引起的。 直接给获取实例的方...

网友评论

      本文标题:单例模式-多线程第二阶段课程

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