锁的升级与对比
2018-05-28 本文已影响1人
土豆有点
先占一个坑,之后来回答。
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.pngimage.png
减少锁粒度,可能会带来什么负面影响呢?以ConcurrentHashMap为例,说明分割为多个Segment后,在什么情况下,会有性能损耗?
语言层面的优化----锁分离(从功能上减小锁的粒度)
image.png语言层面的优化---锁粗化
image.pngimage.png