jdk动态代理
1 |
|
cglib动态代理
1 |
|
- jdk动态代理对象必须实现接口
- cglib使用字节码处理框架ASM,通过生成被代理对象的子类方式实现
- cglib无法代理final类
1 |
|
1 |
|
线程状态
线程切换
线程创建
另附Java内存模型笔记
设计模式是程序员进阶、面试无法躲避的内容,也是阅读源代码、提升代码质量最重要的内功。
今天下决心好好学一遍设计模式,先做一些准备工作。
1 .单一职责原则(Single Responsibility Principal)
一个类只包含单一职责,有且仅有一个原因使类发生变化。
2.开放封闭原则(Open-Closed Principal)
对扩展开放,对修改封闭。即可扩展,不可修改。需求变更后通过添加类而不是修改类实现。
3.里氏替换原则(Liskov Substitution Principal)
所有使用父类的地方,都可以使用子类替换。
4.接口隔离原则(Interface Segregation Principal)
实现类不应该包含不需要但必须实现的方法。也就是接口功能要足够聚合。
5.依赖倒置原则(Dependency Inversion Principal)
抽象不应该依赖细节,细节要依赖抽象,也就是要面向接口编程而不针对实现编程。
看到这里的各位萌亲,就问你蒙不蒙圈(不蒙圈的应该是大神,左手出门不送),我反正蒙圈了,但大神还是建议我先记住Solid原则,学完23种设计再回来理解。他说“跟产品大大相爱相杀几年后再回来理解设计原则,一定会明白大神们总结的原则有多重要”。
3.1 类
由类名、属性、操作组成
3.1.1 类名
类的名字,如图中的Employee
3.1.2 属性
类的成员变量,格式
可见性 名称:类型[=默认值]
可见性符号
3.1.3 操作
类的方法,格式
可见性 名称(参数列表)[:返回类型]
可见性同属性
3.2 接口
接口由名字、操作组成,名字上部有<
3.3 关系
时序图(Sequence Diagram)按照时间顺序显示对象之间交互,包括角色(Actor)、对象(Object)、生命线(Lifeline)、控制焦点(Focus of control)、消息(Message)
角色(Actor)
对象:对象名+类名
生命线:对象向下延伸的虚线
控制焦点:生命线上的矩形,执行操作
消息:
同步消息,实线+实心箭头
异步消息,实线+箭头
返回消息,虚线+箭头
自关联消息,对象内部方法调用
Combined Fragments
Alternative fragment(denoted “alt”) 与 if…then…else对应
Option fragment (denoted “opt”) 与 Switch对应
Parallel fragment (denoted “par”) 表示同时发生
Loop fragment(denoted “loop”) 与 for 或者 Foreach对应
是什么
解决什么问题
实现方式分类
饿汉模式实现方式
私有化构造方法
初始化私有的static final属性为实例化对象
对外暴露getInstance静态方法
代码示例
1 | class Singleton { |
懒汉模式实现方式
getInstance方法加synchronized,防止多线程同时调用创建多个对象。所有获取单例实例化对象都会加锁。单例、线程安全、性能差。
1 | class Singleton { |
双重检查锁,只有在INSTANCE为空的时候加锁,常规获取单例不加锁,避免频繁加锁;给INSTANCE添加volatile,多线程其他线程可以获取INSTANCE最新创建情况。单例、线程安全、性能好。
1 | class Singleton { |
静态内部类,利用类加载机制保障单例及线程安全。单例、线程安全、性能好。
1 | class Singleton { |
枚举,枚举类型及枚举变量在JVM中都是唯一的,同时枚举类型在序列化和反序列化在JVM也是同一个,可以保证绝对单例。序列化单例、线程安全、性能好。
1 | public enum Singleton { |
关联知识点
类加载过程,加载->验证->准备->解析->初始化,初始化会对静态变量赋值,由此可知饿汉模式类加载完成对象即创建完。
静态内部类,静态内部类在使用的时候才会加载,类加载会初始化static变量。
线程安全,内存模型,volatile,synchronized,设计知识点略多,以后单独写。
枚举特性,枚举类型及枚举变量在JVM中都是唯一的。在序列化的时候Java将枚举对象的name属性输出到结果中,反序列化的时候通过java.lang.Enum的valueOf方法来根据名字查找枚举对象。