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