饿汉式:
一上来我就把对象给你 new 好了,你来了直接就可以拿去“吃”了
1 public class Single { 2 // 1.私有化构造方法 3 private Single() { 4 } 5 6 // 2.new 一个Single对象 7 private static final Single single = new Single(); 8 9 // 创建一个方法,让外面的类可以拿到对象的引用 10 public static Single getInstance() { 11 return single; 12 } 13 }
懒汉式
(要是有人问单例的延迟加载方式指的就是这种方式)
一开始我就不给你 new 对象,你来找我,我在给你创建一个对象
1 public class Single { 2 // 1.私有化构造方法 3 private Single() { 4 } 5 6 // 2.声明一个对象的引用 7 private static Single single = null; 8 9 // 3.判断一下,如果对象为null,则创建一个新对象 10 public static Single getInstance() { 11 if (single == null) { 12 single = new Single(); 13 } 14 return single; 15 } 16 }
懒汉式有一个缺点,就是在多线程中使用的时候,可能会创建多个实例对象,比如,线程1来调用 getInstance() 方法,判断了 s==null,然后线程1由于未知的原因阻塞了,线程2再来调用 getInstance() 方法,判断 s==null ,线程2就创建了一个对象,这时候线程1又运行了,那么线程1就会创建一个对象~这样就会造成多个对象~
懒汉式的线程优化——加一个锁
1 public class Single { 2 // 1.私有化构造方法 3 private Single() { 4 } 5 6 // 2.声明一个对象的引用 7 private static Single single = null; 8 9 // 3.判断一下,如果对象为null,则创建一个新对象(同步锁synchronized) 10 public static synchronized Single getInstance() { 11 if (single == null) { 12 single = new Single(); 13 } 14 return single; 15 } 16 }