1、简介
静态内部类单例是一种线程安全的单例实现方式,它利用了Java 的类加载机制来实现单例模式。
它的实现思路是将单例的实例放在一个静态内部类中,在第一次调用单例对象时再进行创建。这种实现方式既能保证线程安全,又能保证单例对象的延迟加载。
2、代码实现
public class Singleton {
//Singleton单例
private Singleton(){}
private static class SingletonHolder{
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance(){
return SingletonHolder.INSTANCE;
}
}
3、优缺点
优点:
①线程安全:由于使用了Java类加载机制,单例对象在类加载阶段就已经创建好,并且只会创建一次,因此是线程安全的。
②类加载性能优秀:在使用单例对象时才会进行创建,而且只会创建一次,在资源有限的情况下能够节约内存。
③使用简单:通过Singleton.getInstance()来获取单例对象
缺点:
①可能会增加类的数量,因为需要一个静态内部类来保存单例对象
②第一次加载时可能会略微增加启动时间
总结来说,静态内部类单例是一种实现单例模式的优秀方式,它既保证了线程安全,又具有很好的类加载性能,并且使用起来非常方便。
4、应用场景
静态内部类单例模式非常适合在需要频繁使用、且资源占用较小的单例对象时使用。
常见的应用场景有:
①工具类:比如日期处理工具类、字符串工具类等
这些工具类一般需要非常频繁地使用,而且资源消耗也不大,所以可以使用静态内部类单例模式来实现。
public class DateUtils {
private DateUtils(){}
private static class DateUtilsHolder {
private static final DateUtils INSTANCE = new DateUtils();
}
public static DateUtils getInstance() {
return DateUtilsHolder.INSTANCE;
}
public String formatDate(Date date){
//do format job
}
}
②日志管理类:由于日志管理类可能会在多个地方使用,并且资源消耗也不大,所以可以使用静态内部类单例模式来实现。
public class Logger {
private Logger(){}
private static class LoggerHolder {
private static final Logger INSTANCE = new Logger();
}
public static Logger getInstance() {
return LoggerHolder.INSTANCE;
}
public void log(String message){
//do log job
}
}
静态内部类的实际应用场景不局限在这里,还有很多其他场景可以使用,如配置管理类、高效缓存类等。