美文网首页
多线程下的单例模式

多线程下的单例模式

作者: 说码解字 | 来源:发表于2020-07-06 20:26 被阅读0次
public class Singleton{
    private static Singleton instance;
    private Singleton{
        
    }
    public static Singleton getInstance(){
        if(instance == null){
            instance = new Singleton();
        }
        return instance;
    }
}

以上便是单例模式的一般实现,本文想讨论一下单例模式在多线程中应用时的情况。

如果实例为空,可能存在两个线程同时调用getInstance方法的情况。如果发生这种情况,第一个线程会首先使用新构造器实例化单例对象,同时第二个线程也会检查单例实例是否为空,由于第一个线程还没完成单例对象的实例化操作,所以第二个线程会发现这个实例是空的,也会开始实例化单例对象。在实例化单例对象需要较长时间的情况下,这种情况是可能发生的。

为了解决这个问题,我们需要创建一个代码块来检查实例是否空线程安全。可以通过以下两种方式来实现。

方法一:向getInstance方法的声明中添加synchronized关键字以保证其线程安全:

public static synchronized Singleton getInstance()

方法二:用synchronized代码块包装if(instance==null)条件。在这一环境中使用synchronized代码块时,需要指定一个对象来提供锁,Singleton.class对象就起这种作用。

synchronized(Singleton.class){
    if(instance == null){
        instance = new Singleton();
    }
}

上面的实现方式能够保证线程安全,但同时带来了延迟。用来检查实例是否被创建的代码是线程同步的,也就是说此代码块在同一时刻只能被一个线程执行,但是同步锁(locking)只有在实例没被创建的情况下才起作用。如果单例实例已经被创建了,那么任何线程都能用非同步的方式获取当前的实例,而无需经过线程锁的同步过程,避免了不必要的延迟。

所以,只有在单例对象未实例化的情况下,才能在synchronized代码块前添加附加条件移动线程安全锁:

if(instance == null){
    synchronized(Singleton.class){
        if(instance == null){
            instance = new Singleton();
        }
    }
}

以上便是所谓的同步锁单例模式的双重校验锁机制,听着很复杂,其实很简单。

还有一种单例的实现方式可以避免使用同步锁机制和检查实例是否被创建,这种方式中类只会加载一次,通过在声明时直接实例化静态成员的方式来保证一个类只有一个实例:

public class Singleton{
    private static final Singleton instance = new Singleton();
    private Singleton{
        
    }
    public static Singleton getInstance(){
        return instance;
    }
}

微信公众号编程技术漫谈

相关文章

  • 单例模式Java篇

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

  • 多线程(下)&GUI

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

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

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

  • 单例模式

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

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

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

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

    单例模式3:多线程一

  • 单例模式

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

  • 1.5 单例模式

    不做赘述, 单例模式想必大家已经烂熟于心了. 这里提一下多线程如何保证的单例模式的线程安全. 外部的if判断不加锁...

  • OC 和 swift 创建单例方法

    OC单例 1.使用GCD(推荐使用) 2.单线程模式单例 此单例只有在单个线程使用的情况下实用,在多线程的情况下,...

  • 三、单例模式详解

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

网友评论

      本文标题:多线程下的单例模式

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