1 单例模式
public class Singleton {
// volatile可以禁止指令重排序,如果没有volatile,线程可能拿到未实例完成的对象
private static volatile Singleton singleton = null;
// 构造函数私有,防止在外部new实例对象
private Singleton() {
}
public static Singleton getInstance() {
if(singleton == null) {
// 为什么要判断两次?线程1和线程2都走到这里,线程2拿到锁,创建了实例
synchronized (Singleton.class) {
// 如果这里不进行判空,线程2已经创建了实例,线程1进来,又会创建一个实例
if(singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
2 装饰者设计模式
装饰器模式和代理模式的区别 装饰器模式强调的是增强自身,能在被增强的类上使用增强后的功能。 代理模式是给一个对象提供一个代理对象,代理对象控制持有原对象的引用,实现与业务没有太多关系的职责如记录日志、设置缓存等。 zhuanlan.zhihu.com/p/97499017