最近我在接受以下代码的采访时询问了
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() { } }
以下是这个问题的选项
- More than one instance of Bolton can be created
- A Bolton will never be created
- The constructor is private and can’t be called
- Value can be garbage collected,and the call to getInstance may return garbage data
以下哪个选项是正确的?为什么?
解决方法
这是一个
Singleton Pattern
Singleton Pattern的想法只有一个可用的类的实例.因此,构造函数设置为private,在这种情况下,类维护一个getInstance()方法,该方法既可以调用此类中的现有实例变量INST,也可以为执行程序创建一个新的实例变量INST.答案可能是1,因为它不是线程安全的.对于我早已放下的3号可能会感到困惑,但在设计上,技术上并不是一个缺点.
以下是维基百科的Lazy Initialization,线程安全单例模式的示例:
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这是一个“懒惰初始化”单例会发生什么