我最近在一次采访中被问到与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 实例
- 博尔顿永远不会被创造出来
- 构造函数是私有的,不能被调用
- Value可以被垃圾回收,调用getInstance可能会返回垃圾数据
以上哪个选项是正确的?为什么?
这是一个单例模式 http://en.wikipedia.org/wiki/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 http://jeremymanson.blogspot.com/2008/11/what-volatile-means-in-java.html告诉 Java 从内存中读取它,而不是将其设置到缓存中。
同步语句或方法 http://docs.oracle.com/javase/tutorial/essential/concurrency/帮助并发性 http://en.wikipedia.org/wiki/Concurrency_(computer_science).
阅读更多关于双重检查锁定 http://en.wikipedia.org/wiki/Double-checked_locking这就是“延迟初始化”单例会发生的情况
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)