设计模式(JAVA)
设计模式(JAVA)
单例
### 六种实现方式,主要区别在于:lazy?线程安全?效率?序列化?
https://www.runoob.com/design-pattern/singleton-pattern.html
### 基础懒汉式,线程不安全
### 懒汉式,加锁
### 饿汉式
### 懒汉式,双锁DCL
- 第一次判断,是为了在singleton对象已经创建的情况下,避免进入同步代码块,提升效率。
- 第二次判断,检查是否已有进程进入过同步代码块创建了单例
- Volatile关键字
保证可见性和原子性,同时保证JVM对指令不会进行重排序
- 创建对象的原子操作
指令1:获取singleton对象的内存地址
指令2:初始化singleton对象
指令3:将这块内存地址,指向引用变量singleton。
### 登记式,静态内部类
利用了classloader
### 枚举
枚举对象天生为单例
### 反射攻击、序列化攻击
- 构造函数中进行判断,抛出异常
- 或者使用枚举,由jvm保证,使用readResolve()方法,根据返回反序列化的值直接返回特定枚举对象
代理
### 静态代理
- 静态代理在编译时就将接口、实现类、代理类这些都变成了一个个实际的 class 文件
### 动态代理
- 动态代理是在运行时动态生成类字节码,并加载到 JVM 中的 (工厂模式)
- JDK 动态代理、CGLIB 动态代理
1. JDK 动态代理只能代理实现了接口的类或者直接代理接口,而 CGLIB 可以代理未实现任何接口的类。 另外, CGLIB 动态代理是通过生成一个被代理类的子类来拦截被代理类的方法调用(底层为🔎 【待扩展】ASM框架),因此不能代理声明为 final 类型的类和方法。
2. 就二者的效率来说,大部分情况都是 JDK 动态代理更优秀,随着 JDK 版本的升级,这个优势更加明显。

浙公网安备 33010602011771号