单例模式的几种实现

来源:互联网 发布:小天才手表没有网络 编辑:程序博客网 时间:2024/06/06 02:31

1、饿汉式,线程安全 但效率比较低

public class Singleton0 {    /**     * 定义私有构造方法(防止通过 new SingletonTest()去实例化)     */    private Singleton0() {    }    private final static Singleton0 instance = new Singleton0();    public static Singleton0 getInstance() {        return instance;    }}

2、只适用于单线程环境,饱汉式,非线程安全 。

public class Singleton1 {    /**     * 将构造方法设置成私有的,禁止他人创建实例。     */    private Singleton1() {    }    private static Singleton1 instance;    public static Singleton1 getInstance() {        if (instance == null) {            instance = new Singleton1();        }        return instance;    }}

3、适用于多线程环境,饱汉式,线程安全简单实现

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

4、加同步锁之后两次判断实例是否存在,内存占用小,效率高,线程安全,多线程操作原子性。

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

5、实现按需创建实例。

public class Singleton4 {    private Singleton4() {    }    public static synchronized Singleton4 getInstance() {        return SingleHolder.instance;    }    private static class SingleHolder {        private static Singleton4 instance = new Singleton4();    }}