单例,双重检查锁
new 一个对象氛围三步
- 申请内存,设默认值 0
- 设置初始值
- 建立关联
new 对象的时候会有一个问题,就是指令重排序
可以加volatile,volatile的一个作用就是禁止指令重排序,因为有内存屏障
volatile 是JVM的关键字
有两个作用,一个是禁止指令重排序,一个是线程可见性。
一些面试问题
线程的原子性
为了保证线程的原子性,需要加锁,一个线程执行完,才允许下一个线程的操作
java对象的内存布局
分为头信息和补全信息,头信息里面有锁信息等,如果头信息的字节不够被8整除,就会被补全到让8能够整除。
没有加锁的对象与加锁的对象的内存布局对比
轻量级锁的种类
重量级锁
有一个线程持有着这把锁,其他想要获得锁的线程进入等待队列,等持有锁的线程释放锁后,操作系统会让一个等待线程获得锁。不消耗CPU资源。
轻量级锁
有一个线程持有着这把锁,其他想要获得锁的线程就循环等待,等持有锁的线程释放锁后,其他等待锁的线程就是抢锁,谁抢到是谁的,会消耗CPU资源。
CAS存在的问题
ABA 问题
解决:加版本号
synchronized 与 reentrantlock 的共同点
synchronized 与 reentrantlock 的区别
面试题
用两个线程,一个输出字母,一个输出数字,交替输出1A2B3C4D…26Z
如何让第二个线程先执行
8)]
如何让第二个线程先执行
[外链图片转存中…(img-oxifLbCs-1614591470888)]
[外链图片转存中…(img-L4NUYrrt-1614591470889)]