设计模式——单例模式

单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在

单例好处:

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

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

  • 有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了。所以只有使用单例模式,才能保证核心交易服务器独立控制整个流程。

饿汉模式

/**
 * 单例模式——饿汉模式(线程安全)
 * 此种写法,在类加载时,便创建了类的单实例。
 * 因为类只被装载一次(同一个类装载期),所以只有一个实例;
 * 此种饿汉模式不存在现成安全问题,即多线程环境下也可以保证只有一个实例。
 */
public class Singleton {
    private  Singleton(){

    }
    private static Singleton instance = new Singleton();

    public static Singleton getInstance(){
        return  instance;
    }
}

懒汉模式——静态内部类

/**
 * 单例模式——懒汉模式(静态内部类,线程安全)
 */
class Singleton3 {
    private  Singleton3(){

    }

    private static class Singleton3Holder{
        private static Singleton3 instance = new Singleton3();
    }

    public static Singleton3 getInstance(){

        return  Singleton3Holder.instance;
    }

}

懒汉模式——枚举

/**
 * 单例模式——懒汉模式(枚举,线程安全)
 */
enum Singleton4{
    INSTANCE;
}

懒汉模式——双重校验锁

/**
 * 单例模式——懒汉模式(双重校验所,线程安全)
 */
class Singleton5{
    private  Singleton5(){

    }

    /**
     * 此处的volatile:
     * 这一块代码,有线程A和线程B,如果A先进入第一个if语句,A线程开始实例化Singleton对象,对象的实例化有三个步骤: 分配内存空间,初始化对象,将内存中的地址赋值给变量。
     * 这里可能会发生重排序,如果这里先执行分配和赋值操作,线程B此时进入第一个if语句,发现变量不为null,直接返回这个实例,然后B线程此时拿到的可能是还没有实例化的对象。
     * 所以用volatile修饰singleton就可以避免这种重排序了。
     */
    private volatile static Singleton5 instance;

    public static Singleton5 getInstance(){
        if(instance == null){
            synchronized (Singleton5.class){
                if(instance == null){
                    instance = new Singleton5();
                }
            }
        }
        return  instance;
    }
}

参考:http://www.blogjava.net/kenzhh/archive/2016/03/28/357824.html#post

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值