常用设计模式回顾--单例模式

常见设计模式回顾–单例模式
单例模式应该是大家设计模式入门的第一课了,主要就是用于对象只需要对外提供一个实例的时候;这里介绍几种常用的单例写法;
1.饿汉式 --真是太饿了,没人调用我先自己实例化好;

public class SingletonOne {
    //私有构造方法,防止外部new
    private SingletonOne() {
    };

    private static SingletonOne testSingletonOne = new SingletonOne();

    public static SingletonOne getInstance() {
        return testSingletonOne;
    }
}

饿汉式比较消耗资源,类加载完后加初始化了对象。线程安全

2.懒汉式 --真是太懒了,有人来调用了我再实例化;

public class SingleTonTwo {
    private static SingleTonTwo singleTonTwo;

    //私有构造方法,防止外部new  
    private SingleTonTwo(){
    }

    public static SingleTonTwo getSingelTonTwo() {
        if (singleTonTwo == null) {
            singleTonTwo = new SingleTonTwo();
        }
        return singleTonTwo;
    }
}
懒汉式在调用时进行加载,但是多线程情况下不安全;推荐使用下面第三种双重检验锁的懒汉式
public class SingleTonThree {
    private static volatile SingleTonThree singleTonThree;

    //私有构造方法,防止外部new  
    private SingleTonThree(){
    }

    public static SingleTonThree getSingleTonThree() {
        if (singleTonThree == null) {
            synchronized (SingleTonThree.class) {//对class加锁,防止多线程同时去创建
                singleTonThree = new SingleTonThree();
            }
        }
        return singleTonThree;
    }
}

线程安全的懒汉式双重检查模式,进行了两次判断,第一次进行判空,对象不为空肯定不需要再实例化;第二次是为了进行同步,避免多线程问题。由于singleton=new Singleton()对象的创建在JVM中可能会进行重排序,在多线程访问下存在风险,使用volatile修饰禁止重排序并保证多线程中对象可见性。

the end—这里说的单例都是不考虑反射,反射毫不讲理;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值