懒汉式单例是指在类加载的时候不创建单例实例,只有在第一次请求获取单例实例的时候创建。并且第一次创建后一直使用该实例,不再创建其它实例。
懒汉式单例设计模式在Java中很容易实现,简单的实现代码如下:
注意:懒汉式在使用时才创建实例,避免浪费内存,为了避免多线程问题必须加锁(synchronized)才能保证单例,但是会稍微影响效率。
上面这种把锁加在方法上,可以保证线程安全,是绝对的单例,还可以把锁加在代码块上,如下:
上面这种代码块锁加上双重检查的方法大部分情况下是线程安全的,但是如果发生指令重排序就会发生线程不安全的情况,
指令重排后
那么如何解决这个问题呢?加valotile关键字即可:
valotile作用:内存可见性、禁止指令重排序
这种方式不但可以实现线程安全的创建实例,而且又不会对性能造成太大的影响。
因为volatile可能会屏蔽掉虚拟机中的一些代码优化,所以建议没有特别需要不要使用valotile,要根据情况而定。
代码:https://gitee.com/blueses/design-pattern