java学习笔记210226

单例,双重检查锁

new 一个对象氛围三步
  1. 申请内存,设默认值 0
  2. 设置初始值
  3. 建立关联
new 对象的时候会有一个问题,就是指令重排序

可以加volatile,volatile的一个作用就是禁止指令重排序,因为有内存屏障

volatile 是JVM的关键字

有两个作用,一个是禁止指令重排序,一个是线程可见性。

image-20210226102702495

image-20210226102757830

一些面试问题

image-20210226103830233

线程的原子性

image-20210226111407167

为了保证线程的原子性,需要加锁,一个线程执行完,才允许下一个线程的操作

image-20210226111718278

java对象的内存布局

分为头信息和补全信息,头信息里面有锁信息等,如果头信息的字节不够被8整除,就会被补全到让8能够整除。

没有加锁的对象与加锁的对象的内存布局对比

image-20210226112218624

轻量级锁的种类

image-20210226113105033

重量级锁

image-20210226114602603

有一个线程持有着这把锁,其他想要获得锁的线程进入等待队列,等持有锁的线程释放锁后,操作系统会让一个等待线程获得锁。不消耗CPU资源。

轻量级锁

有一个线程持有着这把锁,其他想要获得锁的线程就循环等待,等持有锁的线程释放锁后,其他等待锁的线程就是抢锁,谁抢到是谁的,会消耗CPU资源。

CAS存在的问题

ABA 问题

image-20210226134644249

解决:加版本号

image-20210226135541370

synchronized 与 reentrantlock 的共同点

image-20210226141426173

synchronized 与 reentrantlock 的区别

image-20210226141652907

image-20210226141849362

image-20210226142154906

image-20210226142314198

面试题

用两个线程,一个输出字母,一个输出数字,交替输出1A2B3C4D…26Z

image-20210226145643215

image-20210226150102063

如何让第二个线程先执行

image-20210226150339682

image-20210226150746706

8)]

如何让第二个线程先执行

[外链图片转存中…(img-oxifLbCs-1614591470888)]

[外链图片转存中…(img-L4NUYrrt-1614591470889)]

image-20210226150826706

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丢了尾巴的猴子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值