设计模式之单例模式

Posted fenjyang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之单例模式相关的知识,希望对你有一定的参考价值。

一,前言

? 单例模式在23中设计模式中是最为基础的一种,并且使用范围非常广泛,属于设计模式中的创建型模式。

? 什么是单例:指某一个类只允许存在一个实例对象。

? 单例模式特点:

  • 单例只允许一个实例存在,减少资源浪费。
  • 对于频繁创建和销毁的对象,单例模式可以很好的解决,提高系统的性能。
  • 单例类只能自己提供自己的实例对象,因为单例模式构造方法是私有的。
  • 对外提供唯一的全局访问方式。

? 单例模式的实现:懒汉式,饿汉式。

二,饿汉式

? 饿汉式单例模式,字面理解就是很饿很急的感觉。因此这种单例对象就是即时创建,类初始化完成时该对象就已经创建完成。使用起来很方便,但是很容易产生较多的垃圾对象,同时浪费内存空间,下面请看示例代码:

public class Singleton 
    private static Singleton singleton = new Singleton();
    // 私有化无参构造
    private Singleton()
    // 对外提供访问对象的接口
    public static Singleton getSingleton()
        return singleton;
    

? 饿汉式是线程安全的,在类加载时就已经创建完成。

三,懒汉式

? 懒汉式的创建方式与饿汉式相反,即什么时候用到就什么时候创建,典型的懒加载机制。因此在多线程情况下是线程不安全的,容易重复创建对象,违背了单例模式的原则。

public class Singleton2 
    private static Singleton2 singleton2;
    // 私有构造方法
    private Singleton2() 
    public static Singleton2 getInstance() 
        // 判断如果不存在,则创建
        if (singleton2 == null) 
            singleton2 = new Singleton2();
        
        return singleton2;
    

? 对于懒加载线程不安全问题,可以使用synchronized,双重检验锁。

四,synchronized

? synchronized可以保证线程安全,但是我们都知道,使用这种方式效率是很低的,因为程序会不断判断锁是否存在,判断获取锁,释放锁。(不推荐使用)

public class Singleton 
    private static Singleton instance;
    private Singleton ()
    // 同步方法
    public static synchronized Singleton getInstance() 
        if (instance == null) 
            instance = new Singleton();
        
        return instance;
    

五,双重检验锁

? 这里先说明以下,双重检验锁不是指使用两次synchronized关键字,而是在锁之前先判断一次单例对象是否已经存在,如果存在则直接获取。不存在再进入同步方法中,但是静态成员变量需要被volatile修饰,防止发生指令重排。

public class Singleton3   
    private volatile static Singleton3 singleton;  
    private Singleton3 ()  
    public static Singleton3 getSingleton()   
        if (singleton == null)   
            synchronized (Singleton3.class)   
                if (singleton == null)   
                    singleton = new Singleton3();  
                  
              
          
        return singleton;  
      

六,静态内部类

? 静态内部类,这种内部类与其外部类之间并没有先后级别,加载外部类的时候,并不会同时加载静态内部类,而只有调用的时候才会进行加载,此时便创建出单例对象。那么对于线程安全问题来说,因为使用静态初始化方式,所以在JVM中就会自动保证线程安全问题。

public class Singleton4   
    private static class SingletonMethod   
        private static final Singleton4 instance = new Singleton4();  
      
    private Singleton4 () 
    
    public static final Singleton4 getInstance()   
        return SingletonMethod.instance;  
      

七,总结

? 对于以上几种方式,要根据实际业务进行选择,但通常情况下饿汉式的使用会多一些,但这不绝对。

? 以上内容均是自主学习总结,如有不适之处欢迎留言指正。

感谢阅读!

?

以上是关于设计模式之单例模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式之单例模式

JAVA设计模式之单例模式(转)

单例模式之单例模式

JAVA设计模式之单例模式

《JAVA与模式》之单例模式

《JAVA与模式》之单例模式