单例模式

饿汉模式

  public class Singleton{
        private static Singleton instance = new Singleton();
        private Singleton () {  
        }
        public Singleton getInstance(){
            return instance;
        }
    }

优点:这种写法比较简单,就是在类装载的时候就完成实例化。避免了线程同步问题。
缺点:在类装载的时候就完成实例化。如果从始至终从未使用过这个实例,则会造成内存的浪费。

懒汉模式

public class Singleton {
    private static Singleton instance;

    private Singleton() {
    }

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

优点:延时加载
缺点:线程不安全

懒汉模式优化

public class Singleton {
    private volatile static Singleton instance;

    private Singleton() {
    }

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

上部分代码因为java指令重排优化导致线程并不安全,所以为了绝对线程安全可在变量前面添加volatile关键字禁止指令重排优化
1、可见性:可见性,是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的。
2、原子性:原子操作线程安全
3、有序性:禁止指令重排序

优点:延时加载,线程安全
缺点:JDK 1.5之前 由于volatile关键字会屏蔽Java虚拟机所做的一些代码优化,可能会导致系统运行效率降低

内部静态类

public class Singleton {
    private Singleton() {
    }
    
    private static class SingleHelper {
        private static final Singleton instance;
    }

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

优点:延时加载,线程安全,推荐使用
缺点:暂无

枚举

public enum  Singleton {
    INSTANCE;
}

优点:延时加载,线程安全,推荐使用
缺点:JDK 1.5之后才能使用。android中使用枚举会占用较多内存

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