欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

比较完善的单例模式

程序员文章站 2022-03-02 14:17:13
...
public class Singleton
{
private static final Singleton singleton = null;
private Singleton()
{
}
public static Singleton getInstance()
{
if (singleton== null)
{
synchronized (Singleton.class)
{
if (singleton== null)
{
singleton= new Singleton();
}
}
}
return singleton;
}
}

 

========================================================

但是涉及并发,上述代码也会有问题

因为jvm优化指令顺序,a在构造成功之前,可能instance就已经不为空。

此时b检查到非null,调用之,出错。

 

解决方案:

将instance设为volatitle(??????)

 

或者使用一个静态内部类:

public class Foo {
    // 似有静态内部类, 只有当有引用时, 该类才会被装载
    private static class LazyFoo {
       public static Foo foo = new Foo();
    }

    public static Foo getInstance() {
       return LazyFoo.foo;
    }
} 
 

 

============================================================

对于java 还可以

public static synchronized Singleton getInstance() {   }

 或者更简单的

private static final Singleton sample = new Singleton();
 

 

 

 

 

 

 

 

 

相关标签: JVM