锁的升级与对比

先占一个坑,之后来回答。
1.锁底层的实现原理是什么?
2.锁为什么会带来额外的性能消耗?
怎么样来减少这种消耗?---针对不同的常见用不同的锁---无锁状态,互斥锁,偏向锁,轻量级锁,重量级锁。(这几种锁怎么触发,怎么结束,运用场景,可以相互转化嘛,各有什么优缺点)
3.为什么要用锁--->单核多线程,时分复用,为了保证线程安全。我们要使用锁,通过锁保证多线程是one by one 执行。这个地方要区分多线程与并发(多核多线程)直接的区别


image.png

1.线程安全---加锁--性能下降
2.对象头Mark
*Mark Word, 对象头的标记,32位
*描述对象的hash、锁信息,垃圾回收标记,年龄

  • 指向锁记录的指针
  • 指向monitor的指针
  • GC标记
  • 偏向锁线程ID
image.png

image.png

image.png

image.png

image.png
语言层面的优化----减少锁的持有时间
image.png
语言层面的优化----减小锁粒度
image.png

image.png

减少锁粒度,可能会带来什么负面影响呢?以ConcurrentHashMap为例,说明分割为多个Segment后,在什么情况下,会有性能损耗?

语言层面的优化----锁分离(从功能上减小锁的粒度)
image.png
语言层面的优化---锁粗化
image.png

image.png
JVM层面的优化---锁消除
image.png
JVM层面的优化---无锁
image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容