单例模式简介及实现方式
1.单例模式的概念思路
单例模式是一种常见的软件设计模式,常常我们的应用中只需要一个对象实例,此时可以用单例模式,每次调用都是同一个实体。
实现思路:
- 构造方法私有化,防止被实例化。
- 提供静态方法,保证每次返回的实例是同一个。
- 多线程下的调用注意线程安全
2.单例模式的七种实现
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;
private Singleton(){}
static {
instance = new Singleton();
}
public Singleton getInstance() {
return instance;
}
3.懒汉模式(线程不安全)
优点:延迟加载,只能用于单线程
缺点:多线程下,线程不安全可能出现多个实例
public class Singleton {
private static Singleton instance;
private Singleton(){}
public static getInstance() {
if(instance==null) {
instance = new Singleton();
}
return instance;
}
4.懒汉模式(线程安全,同步方法)
优点:增加sycronized关键字,线程同步
缺点:效率太低
public class Singleton {
private static Singleton singleton;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
5.双重检查(推荐使用)
优点:线程安全,延迟加载,效率高。执行两次if(singleton==null),在实例化时保证线程安全,第二次调用会直接返回实例,不执行同步代码块了,效率提升。
public class Singleton {
private static volatile Singleton singleton;
private Singleton() {}
public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
6. 静态内部类(推荐)
优点:静态内部类方式在Singleton类被装载时并不会立即实例化,而是在需要实例化时,调用getInstance方法,才会装载SingletonInstance类,从而完成Singleton的实例化。避免了线程不安全,延迟加载,效率高。
public class Singleton {
private Singleton() {}
private static class SingletonInstance {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonInstance.INSTANCE;
}
}
7.枚举(推荐)
public enum Singleton {
INSTANCE;
public void whateverMethod() {
}
}