前言
- 图片上面的personal表示只有图片上面的一行语句是解释图片内容的、local表示这个图片所在标题下的所有语句都是解释图片内容的、global表示有多个标题下的所有语句都是解释图片内容的
- 我是一名大二的学生,学了差不多一年java技术栈了,想记录一下自己对知识点的心得,目前还是个小白,期望大佬们可以指出我笔记中的不足之处、对知识点的认知错误、笔记结构的混乱等
- 这些图片内容都是在观看黑马课程时的视频截图
文章目录
学习了 p152-p157
一、happens-before 规则
1. 规则说明
- 只要符合 happens-before 规则,那么写入操作都是在操作主存,而不是工作内存
personal
2. 七个规则
- 加锁后的写操作
- volatile 修饰的变量的写操作
- 线程开始前的写操作
- 执行打断方法前的写操作
- 线程执行完后所有在线程中执行的写操作
- 默认值的写操作
- 写屏障之前的写操作
local
二、习题:balking 模式
- balking 例题重现
personal
三、线程安全单例 1
1. 饿汉式实现单例
- 加 final 是为了方法代码不被修改
- 如果实现了序列化接口可以定义一个 readResolve 方法来决定反系列化时使用的对象
- 构造方法设为私有是为了保证单例,但暴力反射仍可创建对象
- 设置为静态变量是线程安全的
- 提供静态方法能够更好的管理单例的获取,也符合封装的理念
local
四、线程安全单例 2-4
1. 枚举实现单例
- 枚举通过静态成员变量实现单例
- 没有并发问题
- 枚举单例不能通过反射来创建
- 枚举单例也不存反序列化后创建新对象的问题
- 枚举单例也是一种饿汉式实现单例
- 枚举可以通过构造方法传入参数
local
2. 普通懒汉式实现单例
- 跟 dcl 实现单例相比性能低一点
personal
3. dcl 实现单例
- 跟普通的懒汉式相比性能高一点
- 使用 volatile 关键字是防止指令重排序
local
五、线程安全单例 5
1. 利用静态内部类实现单例(推荐)
- 等同于懒汉式实现单例
- 在静态内部类没有被使用时静态内部类并不会被加载,因此里面的单例也不会被加载
local
六、第五章总结
1. 知识点
- 可见性:由 jvm 缓存优化引起
- 有序性:由 jvm 指令重排序引起
- happens-before 规则
2. 原理
- cpu 的并行执行
- volatile 的读写屏障
3. 模式
- balking 模式
- volatile 实现两阶段终止