Java中锁的机制
2020年12月7日
14:24
目录 |
- - 1. 概要 - 2. 对象头 - 3. 四种锁 - 3.1 偏向锁【线程ID 1|01】 - 3.2 轻量级锁【指向栈锁记录的指针 |00】 - 3.3 重量级锁【指向互斥量(重量级锁)的指针 | 10】 - 4. 总结锁升级过程 - 5. 锁对比
|
1. 概要
应对复杂情况经典的思想是找到统计场景,分级别处理。计算机底层机制其实都不难,不要怕,本质上是正是因为底层,所以需要非常简单的实现,不像抽象层那么间接。就是规则,以及规则组合比较杂。
理解锁要理解锁分级的假设。
- 偏向锁,一般不会碰到竞争,所以看看是不是自己在用,是的话就一直用
- 轻量级锁,竞争不激烈,分时段竞争,自旋一下就能得到,没必要阻塞
- 重量级锁,mutex,阻塞队列,默认自旋
2. 对象头
锁的信息记录在两个地方:
- 对象头
- 线程栈帧中
以下是对象头的结构,熟悉它的结构,有利于后面的理解,后面经常回来翻看即可。
对象头结构如下:
长度 |
内容 |
说明 |
32/64bit |
Mark Word |
存储对象的hashCode或锁信息等 |
32/64bit |
Class Metadata Address |
存储到对象类型数据的指针 |
32/64bit |
Array length |
数组的长度(如果是数组) |
来自 <http://concurrent.redspider.group/article/02/9.html>
其中,锁信息是Mark Word,其结构是: