Java单例模式的几种实现方式
在Java 中,单例类只能有一个实例,必须创建自己的唯一实例,单例类必须给所有其他对象提供这一实例。Java 单例模式有很多种实现方式,在这里给大家介绍单例模式其中的几种。分别是饿汉式,懒汉式,Double CheckLock实现单例,静态内部类。它们都有相互的优缺点。
适用场景:
需要生成唯一序列的环境。
需要频繁实例化然后销毁的对象。
创建对象时耗时过多或者耗资源过多,但又经常用到的对象。
方便资源相互通信的环境。
选择:
单例对象占用资源少,不需要延时加载,枚举好于饿汉。
单例对象占用资源多,需要延时加载,静态内部类好于懒汉式。
一. 饿汉式
线程安全,调用效率高,但是不能延时加载。
//实例化这个类
public class Singleton {private static final Singleton instance = new Singleton();// 私有化构造器private Singleton(){} //创建静态工厂方法,让外部可以获取实例public static Singleton getInstance(){return instance;}
}
二. 懒汉式
线程安全,调用效率不高,但是能够延时加载。
//类初始化时,不初始化这个对象(延时加载,真正用的时候再创建)
public class Singleton {private static final Singleton instance;// 私有化构造器 private Singleton(){} //方法同步,调用效率低// 创建静态工厂方法 ,让外部可以获取实例public static synchronized Singleton getInstance(){if (instance == null) {instance = new Singleton();}}
}
三. Double CheckLock实现单例
Double CheckLock 双重锁判断机制(由于JVM底层模型原因,偶尔会出问题,不建议使用),是在懒汉式单例基础上发展而来的。
public class Singleton {private volatile static Singleton instance; // 私有化构造器private Singleton(){ } //静态工厂方法,双重锁判断机制public static Singleton newInstance(){if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();} }}
return instance;}
}
四.静态内部类
线程安全,调用效率高,可以延时加载。
public class Singleton {private static class fw{private static final Singleton instance = new Singleton();}// 私有化构造器private Singleton(){} //静态工厂方法public static Singleton getstance(){return fw.instance;}
}