在菜鸟教程中的学习加上自己的理解
1、单例模式
//单例模式:一个类有且只有一个对象
public class SingleObject {
//private:防止外界随意给这个属性赋值
//static:防止死循环
private static SingleObject instance = new SingleObject();
//构造方法私有化,这样该类不会被实例化
private SingleObject(){}
//获取唯一可用的对象
//static:为了防止方法依赖对象而创建
public static SingleObject getInstance(){
return instance;
}
}
1、懒汉式
//单例模式:一个类有且只有一个对象
public class SingleObject {
//private:防止外界随意给这个属性赋值
//static:防止死循环
private static SingleObject instance;
//构造方法私有化,这样该类不会被实例化
private SingleObject(){}
//获取唯一可用的对象
//static:为了防止方法依赖对象而创建
public static SingleObject getInstance(){
if(instance == null){
instance = new SingleObject();;
}
return instance;
}
}
2、饿汉式
饿汉式即为第一个例子
3、双重校验锁
//双锁机制
public class SingleObject {
//为什么加volatile?
//短期不出问题,超高并发下会产生数值错误
private volatile static SingleObject instance;
private SingleObject (){}
public static SingleObject getInstance() {
if (instance == null) {
//双重检查
synchronized (SingleObject.class) {
if (instance == null) {
instance = new SingleObject();
}
}
}
return instance;
}
}
4、静态内部类
public class SingleObject {
//final:不能再改变其引用
private static class SingleObjectHolder {
private static final SingleObject INSTANCE = new Singleton();
}
private SingleObject (){}
//final:不能再改变其引用
public static final SingleObject getInstance() {
return SingleObjectHolder.INSTANCE;
}
}
5、枚举
//简洁,自动支持序列化机制,绝对防止多次实例化
public enum Singleton {
INSTANCE;
public void whateverMethod() {
}
}
**经验之谈:**一般情况下,不建议使用第 1 种和第 2 种懒汉方式,建议使用第 3 种饿汉方式。只有在要明确实现 lazy loading 效果时,才会使用第 5 种登记方式。如果涉及到反序列化创建对象时,可以尝试使用第 6 种枚举方式。如果有其他特殊的需求,可以考虑使用第 4 种双检锁方式。
2、工厂模式