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

单例模式的各种写法

程序员文章站 2022-07-13 23:47:04
...

懒汉

public class Sin { //用的时候构建 lazy
    private static Sin sin;

    private Sin(){} //其他对象不能创建对象

    public static synchronized Sin getSin(){
        if(sin == null){
            sin = new Sin();
        }
        return sin;
    }
}	

恶汉

public class Sin {
    public static Sin sin = new Sin();
    private Sin(){};
    Sin getSin(){
        return sin;
    }
}

懒汉模式double-check

public class Sin {
    private static Sin sin;

    private Sin(){} //其他对象不能创建对象

    public static  Sin getSin(){
        //第一个线程获取了单例的实例对象
        //后面的线程不需要进入同步代码块了
        if(sin == null){
            //使用单例的字节码文件对象,且只能用这个锁
            synchronized (Sin.class){
                if (sin == null)
                sin = new Sin();
            }
        }
        return sin;
    }
}

静态内部类[推荐用]

public class Sin {
    private static class SinHolder{ //初始化一个类
        public static final Sin SIN = new Sin();
    }

    private Sin(){};

    // JVM帮助我们保证了线程的安全性,在类进行初始化时,别的线程是无法进入的。
    public static  Sin getSin(){
        return SinHolder.SIN;
    }

}