单例设计模式是您在Java应用程序中最常见的模式之一,并且在核心Java库中也大量使用。Singleton模式中的问题在Java面试中非常常见,并且对如何实现单例模式有一定的了解会有所帮助。本文中,列出有关Singleton模式的一些最常见问题。
以下是我收集的Singleton设计模式问题汇总。如果你知道如何创建线程安全的单例以及实现此模式的不同方法,将重点介绍此模式的关键以及缺点。
1 什么是单例模式?你以前使用过Singleton吗?
Singleton是一个类,在整个应用程序中有一个实例,并提供一个getInstance()方法来访问该Singleton实例。JDK中有许多类是使用Singleton模式实现的,例如java.lang.Runtime,该类提供getRuntime()方法获取对他的访问,并应用获取Java中的可用内存和总内存。
2 Singleton的候选类是什么?你使用Java的Singleton的哪种类?
任何你希望对整个应用程序可用并且整个实例之一,一个实例是可行的类,可成为Singleton。例如:Runtime类,因为在整个Java应用程序上只有一个运行环境可用使Runtime Single是正确的,另一个是实用程序类,譬如GUI中的Popup,如果要显示带有消息的弹出窗口,则可以在整个GUI应用程序上拥有一个PopUp类,并随时获取其实例,然后使用message调用show()即可。
3 可以为Java中的Singleton类的getInstance()方法编写代码吗?
使用静态工厂并进行双重检查锁定
4 使整个getInstance()方法同步还是仅临界部分就可以了?你会选择哪一个?
这是一个非常好的问题,这与双重检查锁定模式有关,同步很好,而且在整个方法上应用此同步时,对getInstance()的调用将被同步并满足。由于仅在单例实例的初始化期间才需要同步,因此要防止创建另一个Singleton实例,最好只同步关键部分而不是整个方法。单例模式也与工厂设计模式密切相关,在工程设计模式中,getInstance()用作静态工厂方法。
5 什么是Singleton的延迟和加载,你将如何实现?
有很多实现Singleton的方法,例如使用双重检查锁定或在类加载期间初始化静态实例的Singleton类。前者称为延迟加载,因为仅当客户端调用getInstance()方法时才创建Singleton实例,而后一种则称为早期加载,因为将类加载至内存时才创建Singleton实例。