Java中的单例

Java中的单例一般来说有:饿汉、懒汉(双重检查)、枚举、静态内部类

以下只说同步的:

饿汉模式就是类加载时即创建对象;

private static final User u=new User();然后方法里返回这个就行

懒汉模式就是延迟对象创建,一般是双重检查:

public class Singleton {
private static volatile Singleton instance=null;
private Singleton() {}
public static Singleton getInstance() {
    if(instance==null) {
        synchronized (Singleton.class) {
            if(instance==null)
                instance=new Singleton();
        }
    }
    return instance;
}

然后这个双重检查还可以优化一下,effective java上说可以优化25%,在我电脑上大概是16.8%(使用2个线程,每个线程创建500个对象,执行3次取平均值)。优化的原因应该是instance是volatile的,if判断的时候要取来取去的,而它取的性能没那么好。

public static Singleton getInstance2() {
    Singleton single=instance;
    if(single==null) {
        synchronized (Singleton.class) {
            //single=instance;这一句书上有,不知道是否必须
            if(single==null)
                instance=single=new Singleton();//instance赋值必须,不然效率会特别低,原因应该也是跟前面说的有关
        }
    }
    return single;
}

}

静态内部类也是很好的做法:

private static class createSingleton{

private static final Singleton instance=new instance();

}

然后在方法里返回就行。

枚举:前面都要设置构造器私有,枚举自动私有了,其实例也是单例的

class Resource{
}

public enum SomeThing {
    INSTANCE;
    private Resource instance;
    SomeThing() {
        instance = new Resource();
    }
    public Resource getInstance() {
        return instance;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_26567507/article/details/78835383
今日推荐