File tree Expand file tree Collapse file tree 1 file changed +7
-5
lines changed
Expand file tree Collapse file tree 1 file changed +7
-5
lines changed Original file line number Diff line number Diff line change @@ -71,11 +71,11 @@ public class com.crossoverjie.synchronize.Synchronize {
7171
7272
7373## 锁优化
74- synchronize 很多都称之为重量锁,` JDK1.6 ` 中对 synchronize 进行了各种优化,为了能减少获取和释放锁带来的消耗引入了` 偏向锁 ` 和` 轻量锁 ` 。
74+ ` synchronize ` 很多都称之为重量锁,` JDK1.6 ` 中对 ` synchronize ` 进行了各种优化,为了能减少获取和释放锁带来的消耗引入了` 偏向锁 ` 和` 轻量锁 ` 。
7575
7676
7777### 轻量锁
78- 当代码进入同步块时,如果同步对象为无锁状态时,当前线程会在栈帧中创建一个锁记录(` Lock Record ` )区域,同时将锁对象的对象头中 Mark Word 拷贝到锁记录中,再尝试使用 CAS 将 Mark Word 更新为指向锁记录的指针。
78+ 当代码进入同步块时,如果同步对象为无锁状态时,当前线程会在栈帧中创建一个锁记录(` Lock Record ` )区域,同时将锁对象的对象头中 ` Mark Word ` 拷贝到锁记录中,再尝试使用 ` CAS ` 将 ` Mark Word ` 更新为指向锁记录的指针。
7979
8080如果更新** 成功** ,当前线程就获得了锁。
8181
@@ -86,15 +86,17 @@ synchronize 很多都称之为重量锁,`JDK1.6` 中对 synchronize 进行了
8686不是则说明有其他线程抢占了锁,如果存在多个线程同时竞争一把锁,** 轻量锁就会膨胀为重量锁** 。
8787
8888#### 解锁
89- 轻量锁的解锁过程也是利用 CAS 来实现的,会尝试锁记录替换回锁对象的 Mark Word 。如果替换成功则说明整个同步操作完成,失败则说明有其他线程尝试获取锁,这时就会唤醒被挂起的线程(此时已经膨胀为` 重量锁 ` )
89+ 轻量锁的解锁过程也是利用 ` CAS ` 来实现的,会尝试锁记录替换回锁对象的 Mark Word 。如果替换成功则说明整个同步操作完成,失败则说明有其他线程尝试获取锁,这时就会唤醒被挂起的线程(此时已经膨胀为` 重量锁 ` )
9090
91- 轻量锁能提升性能的原因是:认为大多数锁在整个同步周期都不存在竞争,所以使用 CAS 比使用互斥开销更少。但如果锁竞争激烈,轻量锁就不但有互斥的开销,还有 CAS 的开销,甚至比重量锁更慢。
91+ 轻量锁能提升性能的原因是:认为大多数锁在整个同步周期都不存在竞争,所以使用 ` CAS ` 比使用互斥开销更少。但如果锁竞争激烈,轻量锁就不但有互斥的开销,还有 ` CAS ` 的开销,甚至比重量锁更慢。
9292
9393### 偏向锁
9494
9595为了进一步的降低获取锁的代价,` JDK1.6 ` 之后还引入了偏向锁。
9696
97- 偏向锁的特征是:锁不存在多线程竞争,并且应由一个线程多次获得锁。当线程访问同步块时,会使用 CAS 将线程 ID 更新到锁对象的 ` Mark Word ` 中,如果更新成功则获得偏向锁,并且之后每次进入这个对象锁相关的同步块时都不需要再次获取锁了。
97+ 偏向锁的特征是:锁不存在多线程竞争,并且应由一个线程多次获得锁。
98+
99+ 当线程访问同步块时,会使用 ` CAS ` 将线程 ID 更新到锁对象的 ` Mark Word ` 中,如果更新成功则获得偏向锁,并且之后每次进入这个对象锁相关的同步块时都不需要再次获取锁了。
98100
99101#### 释放锁
100102当有另外一个线程获取这个锁时,持有偏向锁的线程就会释放锁,释放时会等待全局安全点(这一时候没有字节码运行),接着会暂停拥有偏向锁的线程,根据锁对象目前是否被锁来判定将对象头中的 ` Mark Word ` 设置为无锁或者是轻量锁状态。
You can’t perform that action at this time.
0 commit comments