实现
使用单例,使用getInstance获取对象实例而不用new创建新的实例
getInstance:做一个判断,如果已经存在则直接获取对象,不存在会 new 一个新对象
新建一个单例类,做判断,如果该实例不存在则new 一个实例,如果存在则getInstance,然后return
分类
-
懒汉(用到了才new对象)
private static Singleton instance ;
-
饿汉(先new好,用到了直接使用)
private static Singleton instance = new Singleton();
-
线程安全(多线程环境不会绕过空判断new多个)在null判断处使用synchronized 保证
-
线程不安全(多线程环境可能绕过空判断new多个)没有锁
上述有四种组合 懒安全 懒不安全 饿安全 饿不安全
- 双重校验锁
private volatile static Singleton singleton;
加sychonrized锁并 做两次实例null判断
- 枚举
public enum Singleton { INSTANCE; public void whateverMethod() { } }
- 静态内部类
private static final Singleton INSTANCE = new Singleton();
业务
如sql连接实例,一个用户维护一个连接,如果多次new 实例会造成一个用户多个连接,此处可以用单例模式,保证只维护一个连接。