单例模式(Java实现)

单例模式

1. 懒汉式(静态常量)

优点: 使用比较简单,类装载的时候就完成实例化,没有线程同步的问题;
缺点: 因为在类装载的时候就完成实例化,如果一直没有使用,会浪费内存;
public class Singleton {
    private final static Singleton INSTANCE = new Singleton();

    private Singleton() {
    }

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

2. 饿汉式(静态代码块)

优缺点和上面的一样,只是实现的方式不同;
public class Singleton {
    private static Singleton instance;

    static {
        instance = new Singleton();
    }

    private Singleton() {
    }

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

3. 懒汉式(线程不安全)

只能在单线程下使用,所以这这种写法基本上不使用;
public class Singleton {
    private static Singleton instance;

    private Singleton() {
    }

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

4. 懒汉式(线程安全,同步方法)

其实就是加了一个方法锁,效率太差,不推荐使用
public class Singleton {
    private static Singleton instance;

    private Singleton() {
    }

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

5. 懒汉式(线程安全,同步代码块)

这种实现比上面的效率高一点,但是多线程使用会有问题,也不建议使用
public class Singleton {
    private static Singleton instance;

    private Singleton() {
    }

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

6. 双重检查_Double-Check(推荐使用)

对上面进行了二次非空判断和volatile关键字,这样可以保证了线程安全
public class Singleton {
    private static volatile Singleton instance;

    private Singleton() {
    }

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

7. 静态内部类

在调用getInstance方法的时候创建实例,避免了内存浪费,并且线程安全
public class Singleton {
    private Singleton() {
    }

    private static class SingletonInstance {
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonInstance.INSTANCE;
    }
}

8. 枚举

避免了多线程同步问题,还可以防止反序列化重新创建新的对象
public enum Singleton {
    INSTANCE;

    public void doSomething() {

    }
}

你可能感兴趣的:(单例模式(Java实现))