A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

饿汉式
线程安全,调用效率高,但是不能延时加载。

public class Singleton {

    private static Singleton instance = new Singleton();

    private Singleton() {}

    public static Singleton getInstance(){
        return instance;
    }
}

懒汉式
调用效率不高,但是能延时加载。

如果方法没有 synchronized,单例没有 volatile , 则线程不安全。

public class Singleton {

    private static Singleton instance = null;

    private Singleton(){}

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

懒汉式改良
线程安全,使用了 double-check-lock(双重检查锁),即check-lock-check,目的是为了减少同步的开销。

volatile关键字来修饰 instance,其最关键的作用是防止指令重排。

public class Singleton {

    private volatile static Singleton instance = null;

    private Singleton() {}

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

静态内部类实现
线程安全,调用效率高,可以延时加载。静态内部类不会在 Singleton 类加载时就加载,而是在调用 getInstance() 方法时才进行加载,达到了懒加载的效果。

public class Singleton {

    private Singleton() {}

    public static Singleton getInstance(){
        return SingletonFactory.singletonInstance;
    }

    private static class SingletonFactory{
        private static Singleton singletonInstance = new Singleton();
    }
}

枚举实现
线程安全,调用效率高,不能延时加载,可以天然的防止反射和反序列化调用。

public enum Singleton {

    INSTANCE;

    private String instance;

    Singleton() {
        instance = new String("singleton");
    }

    public String getInstance(){
        return instance;
    }
}


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马