Java中实现Singleton模式

来源:互联网 发布:中拍协网络拍卖公告 编辑:程序博客网 时间:2024/05/19 13:27

以前让我用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静态成员。即简洁又完全正确,推荐给大家。

原创粉丝点击