饿汉式(静态变量)
// 恶汉式(静态变量)
class Singleton{
// 私有化构造函数
private Singleton(){}
// 本类创建实例
private final static Singleton instance = new Singleton();
// 对外提供实例
public static Singleton getIntance(){
return instance;
}
}
-
优点: 代码简洁,线程安全
-
缺点:不是懒加载,可能会造成内存浪费。
-
由于该方式是基于类装载的时候初始化实例,所以在使用getIntance()的时候会触发类的装载,但是触发类的装载有很多种,比如调用类的其他静态变量和静态方法,发射也会触发类装载。这时候初始化实例,就达不到懒加载的效果,造成浪费。
饿汉式(静态代码块)
class Singleton{
// 私有化构造函数
private Singleton(){}
// 本类实例
private static Singleton instance;
// 静态代码块
static{
instance = new Singleton();
}
// 对外提供实例
public static Singleton getIntance(){
return instance;
}
}
优缺点同上
懒汉式(线程不安全)
class Singleton{
// 私有化构造函数
private Singleton(){}
// 本类创建实例
private static Singleton instance;
// 对外提供实例
public static Singleton getIntance(){
if(instance == null){ //当多线程同时判断是否等于null的时候就可能产生多个实例
instance = new Singleton();
}
return instance;
}
}
优缺点:
-
起到了懒加载作用
-
线程不安全
懒汉式(线程不安全,采用同步代码块)
class Singleton{
// 私有化构造函数
private Singleton(){}
// 本类创建实例
private static Singleton instance;
// 对外提供实例
public static Singleton getIntance(){
if(instance == null){ //当多线程同时判断是否等于null的时候就可能产生多个实例
synchronized(Singleton.class){
instance = new Singleton();
}
}
return instance;
}
}
优缺点:
- 该代码是对上面的代码优化但是还是起不到线程安全的作用。假如一个线程刚经过判断null,还没往下执行,另一个线程也通过了为null的判断,这样就会产生多实例。
懒汉式(线程安全,双重检查)
class Singleton{
// 私有化构造函数
private Singleton(){}
// 本类实例 volatile关键字可以保证变量的可见性和有序性
private static volatile Singleton instance;
// 对外提供实例
public static Singleton getIntance(){
if(instance == null){ //当多线程同时判断是否等于null的时候就可能产生多个实例
synchronized(Singleton.class){
if(instance == null){
instance = new Singleton();
}
}
}
return instance;
}
}
优缺点:
-
线程安全
-
效率低下
懒汉式(线程安全,静态内部类)
class Singleton{
// 私有化构造函数
private Singleton(){}
// 私有化的静态内部类
private static class SingletonInstance{
private static final Singleton singleton = new Singleton();
}
//获取实例
public static Singleton getInstance(){
return SingletonInstance.singleton;
}
}
优缺点:
-
线程安全
-
效率高
-
这种方式巧妙的使用的静态内部类类装载机制同时达到了线程安全和懒加载效果,静态内部类在Singleton装载时并不会立即实例化,而是在调用getInstance()方法时,才会装载SingletonInstance 并实例化singleton ,
-
类的静态属性只会在类第一次加载的时候初始化,所以在这里jvm帮助我们保证了线程的安全。
懒汉式(线程安全,枚举类)
enum Singleton{
instance();
public static Singleton getInstance(){
return instance;
}
}
优缺点:
-
线程安全
-
效率高
-
可以防止 反序列化和反射 创建新的对象