单例模式
单例的关键是确保任何时刻都值能存在一个对象。应对得到是需要耗费大量资源进行创建的对象。
单例模式经典的有两种,即饿汉和懒汉模式,饿汉模式是在类加载的时候就初始化,因此不存在线程安全问题。但是饿汉模式有一个问题就是如果这个对象有很大的可能性用不到而且也会占用大量资源,但是仍和创建并一致持有这个大对象,这会导致资源浪费,因此就有了懒汉模式。
懒汉模式就是当使用的时候才去创建,但是这样就可能存在线程安全问题,即两个线程同时去请求创建这个对象的时候,可能会创建两个对象。
这样猛一看是没问题的,执行结果却显示不同,根本原因是一看到null的判断脑海中就有了这个非空的条件,实际上两个线程都进入空判断后,这个空判断就失效了,然后a线程执行完后,b紧跟着又执行了一边。这就是双重检查锁定的问题。
如果优化以下就可以解决这个问题,而且还能得到性能上的提升。