单例模式(Singleton)Holder

简单,又不简单,看看便知道。建议采用demo-4。

demo-1 懒汉式(synchronized)

/**






 
public class Singleton {
 
/**


* 定义一个变量来存储创建好的类实例


*/
 
private static Singleton uniqueInstance = null;
 
/**


* 私有化构造方法,好在内部控制创建实例的数目


*/
 
private Singleton(){
 
//
 
}
 
/**


* 定义一个方法来为客户端提供类实例


* @return 一个Singleton的实例


*/
 
public static synchronized Singleton getInstance(){
 
//判断存储实例的变量是否有值
 
if(uniqueInstance == null){
 
//如果没有,就创建一个类实例,并把值赋值给存储类实例的变量
 
uniqueInstance = new Singleton();
 
}
 
//如果有值,那就直接使用
 
return uniqueInstance;
 
}
 
/**


* 示意方法,单例可以有自己的操作


*/
 
public void singletonOperation(){
 
//功能处理
 
}
 
/**


* 示意属性,单例可以有自己的属性


*/
 
private String singletonData;
 
/**


* 示意方法,让外部通过这些方法来访问属性的值


* @return 属性的值


*/
 
public String getSingletonData(){
 
return singletonData;
 
}
 
}
 

demo-2 懒汉式 (双重检查加锁)

public class Singleton {
 
/**


* 对保存实例的变量添加volatile的修饰


*/
 
private volatile static Singleton instance = null;
 
private Singleton(){    
 
}
 
public static Singleton getInstance(){
 
//先检查实例是否存在,如果不存在才进入下面的同步块
 
if(instance == null){
 
//同步块,线程安全的创建实例
 
synchronized(Singleton.class){
 
//再次检查实例是否存在,如果不存在才真的创建实例
 
if(instance == null){
 
instance = new Singleton();
 
}
 
}
 
}
 
return instance;
 
}
 
}

demo-3 饿流式

public class Singleton {
 
//4:定义一个静态变量来存储创建好的类实例
 
//直接在这里创建类实例,只会创建一次
 
private static Singleton instance = new Singleton();
 
//1:私有化构造方法,好在内部控制创建实例的数目
 
private Singleton(){        
 
}
 
//2:定义一个方法来为客户端提供类实例
 
//3:这个方法需要定义成类方法,也就是要加static
 
//这个方法里面就不需要控制代码了
 
public static Singleton getInstance(){
 
//5:直接使用已经创建好的实例
 
return instance;
 
}
 
}

demo-4 内部类

public class Singleton {
    /**
     * 类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例
     * 没有绑定关系,而且只有被调用到才会装载,从而实现了延迟加载
     */
    private static class SingletonHolder{
        /**
         * 静态初始化器,由JVM来保证线程安全
         */
        private static Singleton instance = new Singleton();
    }
    /**
     * 私有化构造方法
     */
    private Singleton(){
    }
    public static  Singleton getInstance(){
        return SingletonHolder.instance;
    }
}

备注:

1. 全局共享,独一份;

2. 构造函数不暴露(如果暴露便不能保证一份),自己负责自己的构造;

3. 懒汉式:Lazy load,用到才加载,非线程安全。如何保证线程安全呢:

(1) synchronized getInstance()。见demo-1

(2)双重检查加锁。见demo-2。

4. 饿汉式:一开始就申请好,浪费了点资源,但其线程安全。 见demo-3。

5. 内部类:

(1)改成内部类,由JVM保证线程安全性。见demo-4。

参考:

http://www.cnblogs.com/sjms/archive/2010/08/27/1809759.html

原文地址:https://www.cnblogs.com/alipayhutu/p/2509646.html