单例模式-Singleton Pattern
关于单例模式,我们首先会想到其两种实现方式:饿汉式、懒汉式
饿汉式:
/** * 饿汉式单例模式 */ class Singleton{ private static final Singleton singleton = new Singleton(); private Singleton(){} public static Singleton getInstance(){ return singleton; } }
懒汉式(一般实现方式):
1 /** 2 *懒汉式单例模式--延迟加载 非线程安全 3 */ 4 class Single{ 5 private static Single s = null; 6 private Single(){} 7 public static Single getInstance(){ 8 if(s == null){ 9 s = new Single(); 10 } 11 return s; 12 } 13 }
但是上面的饿汉式单例模式,如果在多线程调用的情况下,第8、9行就容易引发线程安全问题。
为了解决这一问题,我们可以引入双重判断同步代码块解决:
/** *懒汉式单例模式--线程安全 */ class Single{ private static Single s = null; private Single(){} public static Single getInstance(){ if(s == null){ synchronized(Single.class){ if(s == null){ s = new Single(); } } } return s; } }
事物总不是完美的,虽然例3解决了懒汉式单例模式的线程安全问题,但因为每一线程访问同步代码块时,都要对Single.class进行锁判断,相应的就牺牲了一部分性能。