Skip to content

Commit e53a4e6

Browse files
committed
update readme in lock.
1 parent 23ceab1 commit e53a4e6

1 file changed

Lines changed: 36 additions & 2 deletions

File tree

lock/README.md

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,38 @@
11
# Lock 篇
2-
32
其实本来 Lock 应该放到 data-structure 模块的,但是为了体现其重要性,
4-
单独用一个篇章来整理。
3+
单独用一个篇章来整理。
4+
5+
## synchronized 与 Lock interface
6+
Java 中两种实现加锁的方式:一种是使用 synchronized 关键字,另一种是使用 Lock 接口的实现类。
7+
8+
在一篇文章中看到一个好的对比,非常形象,synchronized 关键字就像是**自动挡**,可以满足一切的驾驶需求。
9+
但是如果你想要做更高级的操作,比如玩漂移或者各种高级的骚操作,那么就需要**手动挡**,也就是 Lock 接口的实现类。
10+
11+
而 synchronized 在经过 Java 每个版本的各种优化后,效率也变得很高了。只是使用起来没有 Lock 接口的实现类那么方便。
12+
13+
### synchronized 锁升级过程就是其优化的核心:**偏向锁** -> **轻量级锁** -> **重量级锁**
14+
15+
```java
16+
17+
class Test{
18+
private static final Object object = new Object();
19+
20+
public void test(){
21+
synchronized(object) {
22+
// do something
23+
}
24+
}
25+
26+
}
27+
28+
```
29+
30+
使用 synchronized 关键字锁住某个代码块的时候,一开始锁对象(就是上述代码中的 object)并不是**重量级锁**,而是偏向锁。
31+
偏向锁的字面意思就是"偏向于第一个获取它的线程"的锁。线程执行完同步代码块之后,并**不会主动释放偏向锁**。当第二次到达同步
32+
代码块时,线程会判断此时持有锁的线程是否就是自己(持有锁的线程 ID 在对象头里存储),如果是则正常往下执行。**由于之前没有释放,
33+
这里就不需要重新加锁**,如果从头到尾都是一个线程在使用锁,很明显偏向锁几乎没有额外开销,性能极高。
34+
35+
一旦有第二个线程加入**锁竞争**,偏向锁
36+
37+
38+

0 commit comments

Comments
 (0)