学习笔记分享-juc并发编程-happenbefore规则、balking模式习题、多个线程安全单例(单例设计模式)、第五章总结

前言

  • 图片上面的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 实现两阶段终止
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值