以前让我用Java实现Singleton模式,我总是很快地给出如下实现:
public class A {
private static A m_instance = null;
private A() {
}
public static A getInstance() {
if (m_instance == null) {
synchronized (A.class) {
if (m_instance == null) {
m_instance = new A();
}
}
}
return m_instance;
}
}
我认为这段代码既考虑了并发,也实现了Lazy Initialization,从没想到这段代码还会有问题。今天在huyyxy的博客上发现这段代码可能会由于JVM的优化造成错误。该文中给出了另一种方法:
public class Foo {
private static class FooHolder {
static final Foo foo = new Foo();
}
public static Foo getFoo() {
return FooHolder.foo;
}
}
该方法利用了jvm类加载时的特性:第一次使用FooHolder时才初始化FooHolder的foo静态成员。即简洁又完全正确,推荐给大家。