单例模式:Java单例模式的几种写法及它们的优缺点

Posted yongdaimi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单例模式:Java单例模式的几种写法及它们的优缺点相关的知识,希望对你有一定的参考价值。

总结下Java单例模式的几种写法:

1. 饿汉式

public class Singleton


    private static Singleton instance = new Singleton();

    private Singleton() 

    public static Singleton getInstance() 
        return instance;
    

优点:实现简单,不存在多线程问题,直接声明一个私有对象,然后对外提供一个获取对象的方法。

缺点:class 类在被加载的时候创建Singleton实例,如果对象创建后一直没有使用,则会浪费很大的内存空间,此方法不适合创建大对象。

 

2. 懒汉式(线程不安全)

public class Singleton


    private static Singleton instance = null;

    private Singleton() 

    public static Singleton getInstance() 

        if (instance == null) 
            instance = new Singleton();
        
        return instance;
    

优点:节省内存空间,在使用的时候才会创建;

缺点:在多线程下,可能会创建多个实例(一定要重视这个问题,有时候如果在单例对象的构造方法中做了某些重要操作,创建多个实例可能会造成可怕后果,如:打开android的Sqlite数据库连接)。

 

3. 懒汉式(线程安全)

public class Singleton


    private static Singleton instance = null;

    private Singleton() 

    public synchronized static Singleton getInstance() 

        if (instance == null) 
            instance = new Singleton();
        
        return instance;
    

优点:支持多线程,且以懒汉式的方式加载,不浪费内存空间。

缺点:将 synchronized 块加在方法上,会影响并发量,每次调用getInstance()方法都会线程同步,效率十分低下。最重要的是,当创建好实例对象之后,就不必继续进行同步了。

 

4.懒汉式(线程安全,推荐)

public class Singleton


    private static volatile Singleton instance = null;

    private Singleton() 

    public static Singleton getInstance() 
        if (instance == null) 
            synchronized (Singleton.class) 
                if (instance == null) 
                    instance = new Singleton();
                
            
        
        return instance;
    

优点:支持多线程,并发量高,且以懒汉式加载,不浪费内存空间。

缺点:一时找不出缺点,非要说缺点的话,就是实现比较麻烦。

 

以上是关于单例模式:Java单例模式的几种写法及它们的优缺点的主要内容,如果未能解决你的问题,请参考以下文章

设计模式之单例模式的几种写法——java

单例模式的几种写法

单例模式的几种常见写法

Python中的单例模式的几种实现方式的优缺点及优化

单例模式的几种写法的差异

单例模式(下)---聊一聊单例模式的几种写法