单例模式,是设计模式中常被问到的,【也是比较简单的】
目前,需要掌握的有三中形式吧,【枚举】,【懒汉】,和【饿汉】;
1,枚举,这一点要首先说,也是《effective java》推荐的,也是最简单的。
/** * 我们可以通过EasySingleton.INSTANCE来访问实例,这比调用getInstance()方法简单多了。 * 创建枚举默认就是线程安全的,所以不需要担心double checked locking, * 而且还能防止反序列化导致重新创建新的对象 * @author goujy * */ enum SingletonDemo4{ instance;
/**
*这个方法可以删除,就是这里可以写其他方法。。
*
*/
public void otherMathdo(){
}
}
就这样,就没了。。。。简单来说,就一句话,#编写一个单元素的 枚举类#,里面再写 其他的方法,就随意了。
2,再讲懒汉,(之前一直分不清楚,一种方式是懒汉还是饿汉,:( ),懒,我理解为 开始(默认)懒得new 出新对象,在使用的时候,才new 出新对象。
懒汉不加锁,涉及到多线程安全,线程加锁二次check,[个人认为这个其实也够用了]。
/** * 懒汉不加锁 * @author goujy * */ class SingletonDemo1 { private static SingletonDemo1 sd1 = null; private SingletonDemo1() { } public static SingletonDemo1 getInstance() { if (sd1 == null) { sd1 = new SingletonDemo1(); } return sd1; } } /** * 懒汉加锁2 * @author goujy * */ class SingletonDemo2 { private static SingletonDemo2 sd2 = null; private SingletonDemo2() { } public static SingletonDemo2 getInstance() { if (sd2 == null) { //Single Checked synchronized (SingletonDemo2.class) { if (sd2 != null) { //Double Checked sd2 = new SingletonDemo2(); } } } return sd2; } } /** * 懒汉加锁3 * @author goujy * */ class SingletonDemo3{ private volatile static SingletonDemo3 sd3 =null; private SingletonDemo3(){ } public static SingletonDemo3 getInstance(){ if(sd3==null){ synchronized (SingletonDemo3.class) { if(sd3==null){ sd3= new SingletonDemo3(); } } } return sd3; } }
3,再讲 饿汉模式,饿汉(饿的直接创建,不懒的创建了),其实饿汉也分两种,一种是直接用方法getInstance(),一种直接以 public final 静态属性。
/** * 单例模式 * 饿汉隐藏属性,提供方法; * @author goujy * */ public class SingletonDemo { private SingletonDemo() { } private final static SingletonDemo sd = new SingletonDemo(); public static SingletonDemo getInstance() { return sd; } }
/** * 饿汉直接以属性的形式; * @author goujy * */ class SingletonDemo0 { private SingletonDemo0() { } public final static SingletonDemo0 sd = new SingletonDemo0(); }
主要的,基本就这几类。