方法一:饿汉模式
优点:简单且安全,原理跟 String 一样不可变。
public class Singleton{
private final static Singleton instance = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return instance;
}
}
方法二:懒汉模式
优点:只有使用的时候才初始化
缺点:注意事项很多
public class Singleton{
private static Singleton instance;
private Singleton(){}
// 线程不安全,不推荐
public static Singleton getInstanceA(){
if (instance == null)
instance = new Singleton();
return instance;
}
// 效率低,不推荐
public synchronized static Singleton getInstanceB(){
if (instance == null)
instance = new Singleton();
return instance;
}
// 完全正确的,推荐
public static Singleton getInstanceC(){
if (instance == null)
synchronized(Singleton.class){
if (instance == null)
instance = new Singleton();
}
return instance;
}
}
方法三:静态内部类
优点:
- 懒汉模式的懒加载。利用内部类特点--加载一个类时,其内部类不会同时被加载。一个类被加载,当且仅当其某个静态成员(静态域、构造器、静态方法等)被调用时发生。
- 饿汉模式的简单。
public class Singleton{
private Singleton(){}
public static getInstance(){
return InnerSingleton.instance;
}
private static class InnerSingleton{
private final static Singleton instance = new Singleton();
}
}
方法四:枚举
特点:直接利用枚举的单例和线程安全的特征。
enum Single{
SINGLE;
private Single(){}
}
public class Singleton{
public static void main(String[] args){
Single s = Single.SINGLE;
}
}
网友评论