单例模式(Singleton)

单例模式是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。这样的模式有几个好处:

1、某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销;

2、省去了new操作符,降低了系统内存的使用频率,减轻GC压力;

3、有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了。

 

说到单例,就必须说下懒汉式和饿汉式。先上代码:

懒汉式:

public class Singleton {
    
    /** 私有构造方法,防止被实例化 */
    private Singleton() {}
    
    /** 持有私有静态实例,防止被引用,此处赋值为null,目的是实现延迟加载 */
    private static Singleton instance = null;
    
    /** 静态工程方法,创建实例  */  
    public static Singleton getInstance() {  
        if (instance == null) {  
            instance = new Singleton();  
        }  
        return instance;  
    } 
}

饿汉式:

public class Singleton1 {
    
    /** 私有构造方法,防止被实例化 */
    private Singleton1() {}
    
    /** 已经创建好一个静态的对象供系统使用 */
    private static Singleton1 instance = new Singleton1();
    
    /** 静态工程方法,创建实例  */  
    public static Singleton1 getInstance() {  
        return instance;  
    } 
    
}

从上可以看出,懒汉式为线程不安全的、饿汉式是线程安全的。饿汉式虽然是线程安全,但是不管是否使用到此类,都先进行了创建,有点浪费内存之嫌。对此,我们再对懒汉式进行优化,处理线程安全问题,代码如下:

懒汉式线程安全优化:

public synchronized static Singleton3 getInstance() {  
    if (instance == null) {  
        instance = new Singleton();  
    }  
    return instance;  
} 

但是,synchronized关键字锁住的是这个对象,这样的用法,在性能上会有所下降,因为每次调用getInstance(),都要对对象上锁,事实上,只有在第一次创建对象的时候需要加锁,之后就不需要了,所以,这个地方需要改进。我们改成下面这个:

public static Singleton3 getInstance() {  
    if (instance == null) {  
        synchronized (instance) {
            if(instance == null){
                instance = new Singleton3();  
            }
        }
    }  
    return instance;  
} 

 

改编于,如需看原文请点击:http://blog.csdn.net/zhangerqing/article/details/8194653

posted @ 2015-07-07 11:25  蜉蝣朝生而暮死  阅读(149)  评论(0编辑  收藏  举报