常见设计模式回顾–单例模式
单例模式应该是大家设计模式入门的第一课了,主要就是用于对象只需要对外提供一个实例的时候;这里介绍几种常用的单例写法;
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—这里说的单例都是不考虑反射,反射毫不讲理;