概述
有时候有这样一个需求:一个类对外只提供一个实例,并且只能有一个实例.
这时候就需要引入单例模式这种设计模式
分类
饿汉式
类加载完成时就完成了对类实例的实例化。
优点:不涉及多线程问题,不需要考虑线程安全问题。
缺点:类一加载就实例化,提前占用系统资源懒汉式
类加载完成时不进行类实例的实例化,而是在类的实例使用的时候才进行实例化。
优点:类一加载不对实例进行实例化,而是在使用时进行实例化。
缺点:涉及多线程问题,需要考虑线程安全问题
饿汉式
饿汉式天生就是线程安全的,直接用于多线程不会出现问题。
实现代码:
public class Single { private static final Single single = new Single(); private Single(){} // 构造方法私有化 public static Single getInstance() { return single; } }
懒汉式
懒汉式本身就是非线程安全的,下面的例1展示了非线程安全的懒汉式,例2,3,4是实现懒汉式线程安全的3中方式。
1. 懒汉式(一定存在线程安全问题)
实现代码:
public class Single { private static Single single; private Single(){} // 构造方法私有化 public static Single getInstance() { if (single == null) { single = new Single(); } return single; } }
注意: 在单线程状态下,这个懒汉式的单例可以正常工作,但在多线程环境下,仍然能产生多个实例。这就不符合最初的要求了,可以考虑加入锁的机制。