1.4 volatile+双重同步锁
/** * 懒汉模式 * 线程安全 */ public class LazyMode4 { private LazyMode4(){//私有的构造函数} private volatile static LazyMode4 instance = null; public static LazyMode4 getInstance(){ if(instance == null){ synchronized(LazyMode4.class){ if(instance == null){ instance = new LazyMode4(); } } } return instance; } }
2 饿汉模式设计
/** * 饿汉模式 * 线程安全的 */ public class HungryMode1 { private HungryMode1(){//私有的构造函数} private static HungryMode1 instance = new HungryMode1();//单例对象 public static HungryMode1 getInstance(){ return instance; } }
- 饿汉模式的不足:如果饿汉模式中存在过多的处理,会导致这个类在加载的时候特别慢,可能会引起性能问题,如果是只进行类的加载,没有实际的调用的话,会导致资源的浪费
- 所以我们需要考虑的一个点就是肯定会被使用,这样才不会导致过多的浪费,我们来看第二个例子
/** * 饿汉模式 * 单例实例在类装载时进行创建 */ @ThreadSafe public class HungryMode2 { private HungryMode2(){//私有的构造函数} //单例对象 private static HungryMode2 instance = null; //静态代码块 static { instance = new HungryMode2(); } public static HungryMode2 getInstance(){ return instance; } public static void main(String[] args) { // System.out.println(getInstance()); // System.out.println(getInstance()); System.out.println(getInstance().hashCode()); System.out.println(getInstance().hashCode()); } }
在这里呢我们要注意的是:
当我们写单例对象和静态代码块的时候呢,一定要注意他们的顺序,顺序不一样,执行结果会 有所不同