2020-11-25

轻量级锁

如果一个资源有多个线程访问,但多线程访问的时间是错开的(无竞争),如果产生了竞争会升级为重量级锁。

语法任然是synchronized

加锁过程

调用加锁方法时,线程的栈帧里产生一个锁记录对象(JVM层面),

锁记录中的Object reference指向锁对象。

通过ca操作替换锁对象(Object)的mark word,将mark word的值存入锁记录,mark woed的值就变为了锁记录的地址和状态码

如果cas失败有两种情况

1、其他线程已经拥有了这个对象锁,表明有竞争,进入锁膨胀

2、如果原来的线程自己执行了synchronized锁重入,在添加一个lock record

[图片上传失败...(image-e6e68e-1606314354976)]

升级为重量级锁

[图片上传失败...(image-83a17d-1606314354976)]

自旋锁

自旋是为了让后来的线程一尝试获取锁,而不是让他进入阻塞状态。适合多核cpu。如果重试多次后不成功则进入阻塞状态。jdk7后不能控制是否开启自旋

偏向锁

偏向锁在对轻量锁的优化在于每次锁重入不需要进行cas操作,CAS是cpu的一条指令。具体操作是将线程id设置到对象的mark word头,而不是轻量级锁中的锁记录对象地址

你可能感兴趣的:(2020-11-25)