比较完善的单例模式
程序员文章站
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();