首页 > 技术文章 > 单实例模式

pqq-bk 2017-06-03 10:45 原文

  前言:  

  单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中(jvm)一个类只有一个实例。即一个类只有一个对象实例;这几种模式有几种好处:

  1.可以避免实例存在多个引起程序的逻辑错误(比如一个国家有多个主席,肯定会一团糟)

      2.某些创建频繁的类,使用单列模式可以减轻内存的压力

  3.因为类控制了实例化过程,所以类可以灵活更改实例化过程。

 

   单列模式的三种模式:

  1.饿汉模式 

 

//饿汉式--典型的穷屌丝,吃了上顿没下顿。所以要提前准备(类加载就给准备好 )
public class Singleton {
    //在自己内部定义自己的一个实例,只供内部调用
    private static Singleton singleton=new Singleton();
    
    private Singleton(){}
     //这里提供了一个供外部访问本class的静态方法,可以直接访问
    public static Singleton getSingleton(){
        
        return singleton;
    }
}

  这种模式虽然好用,也是线程安全的,但如果多了,严重影响性能。

 

  2.饱汉式(也叫懒汉式)

//饱汉式--典型土豪,吃饱了撑着;饿的时候才临时叫人准备(创建实例)
public class Singleton {
    
    private static Singleton singleton=null;
    
    private Singleton(){}
    
    public static synchronized Singleton getSingleton(){
        
        if (singleton==null) {
            singleton=new Singleton();
        }
        return singleton;
    }
}

这种模式用的比较多,但如果这个类并发使用率高的时候,就影响性能了。

 

  3.双重锁模式

  

//饱汉模式的双重锁模式,提高效率  
public class Singleton {

    private static Singleton singleton = null;

    private Singleton() {
    }

    public static Singleton getSingleton() {
     //只有对象为null的时候才要排队
        if (singleton == null) {
          
            synchronized (Singleton.class) {

                if (singleton == null) {
                    
                    singleton = new Singleton();
                }
            }
        }
        return singleton;

    }
}

 

饱汉模式的优化,进行双重判断,当已经创建过实例对象后就无需加锁,提高效率。也是一种推荐使用的方式。


 

推荐阅读