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头,而不是轻量级锁中的锁记录对象地址

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 锁优化 自旋锁与自适应锁 互斥同步对性能最大的影响是阻塞的实现,挂起线程和恢复线程的操作都需要转入内核态中完成,这...
    SongSea阅读 313评论 0 1
  • Synchronized 锁升级重量级: 只要有一个线程获取到锁的情况下,其他的线程都会变为阻塞的状态。效率非常低...
    滔滔逐浪阅读 194评论 0 0
  • 线程安全与锁优化 1. 线程安全 按照线程安全的安全程度由强到弱排序,Java中各种操作共享数据分为以下5类:不可...
    xMustang阅读 245评论 0 0
  • 最近自己在整理关于并发编程相关的知识点,要细致的了解每个知识背后产生的原因和相关处理并发的底层原理,确实还...
    Android开发_Hua阅读 155评论 0 1
  • synchronized可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享...
    tracy_668阅读 1,097评论 0 22