Singleton pattern interview(单人模式访谈)
问题描述
我最近在采访下面的代码时被问及与java相关的问题,因为我对java非常陌生,几乎没有用Java编写代码,所以我真的不知道下面的代码是做什么的。 问题是 使用以下代码选择描述最糟糕情况的选项:
public class Bolton {
private static Bolton INST = null;
public static Bolton getInstance()
{
if ( INST == null )
{
INST = new Bolton();
}
return INST;
}
private Bolton() {
}
}
以下是此问题的选项
- 可以创建Bolton的多个实例
- 永远不会创建Bolton
- 构造函数是私有的,无法调用
- 值可以垃圾回收,调用getInstance可能返回垃圾数据
以上哪个选项是正确的?为什么?
推荐答案
这是Singleton Pattern
单例模式的思想是一个类只有一个可用实例。因此,constructor
被设置为private
,在本例中,该类维护一个getInstance()
方法,该方法或者调用这个类中的现有实例变量INST
,或者为正在执行的程序创建一个新的实例变量。答案可能是1,因为它不是线程安全的。它可能会被混淆为3,这是我之前写的,但从技术上讲,这是设计出来的,所以实际上不是一个缺陷。
这里是延迟初始化示例,来自维基百科的线程安全单例模式:
public class SingletonDemo {
private static volatile SingletonDemo instance = null;
private SingletonDemo() { }
public static SingletonDemo getInstance() {
if (instance == null) {
synchronized (SingletonDemo.class){
if (instance == null) {
instance = new SingletonDemo();
}
}
}
return instance;
}
}
将实例变量设置为volatile
告诉Java从内存中读取它,并且不在缓存中设置它。
Synchronized statements or methods帮助concurrency。
阅读有关double checked locking的更多信息,这就是"延迟初始化"单例会发生的情况
这篇关于单人模式访谈的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:单人模式访谈
基础教程推荐
- 如何强制对超级方法进行多态调用? 2022-01-01
- 如何使用 Eclipse 检查调试符号状态? 2022-01-01
- 如何在不安装整个 WTP 包的情况下将 Tomcat 8 添加到 Eclipse Kepler 2022-01-01
- Java 中保存最后 N 个元素的大小受限队列 2022-01-01
- 由于对所需库 rt.jar 的限制,对类的访问限制? 2022-01-01
- 如何使用 Stream 在集合中拆分奇数和偶数以及两者的总和 2022-01-01
- 在螺旋中写一个字符串 2022-01-01
- Spring Boot Freemarker从2.2.0升级失败 2022-01-01
- 如何对 HashSet 进行排序? 2022-01-01
- 首次使用 Hadoop,MapReduce Job 不运行 Reduce Phase 2022-01-01