并发编程 ReentrantLock

本文将介绍 JUC 中的可重入锁 ReentrantLock。

一、什么是 ReentrantLock?

可重入锁,此类型的锁允许被同一个线程重复加锁。

JUC 提供了可重入锁 ReentrantLock。

二、说明

假如线程已经对一把锁加锁,

  • 如果该锁是可重入锁,线程可以继续加锁

  • 如果该锁是非可重入锁,线程将会阻塞

    因为此时锁已被占据(虽然占据者是线程自身),因此线程会进入阻塞状态

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Test {

Lock rtl = new ReentrantLock();

int value;

public int get() {
// 获取锁
rtl.lock();
try {
return value;
} finally {
// 保证锁能释放
rtl.unlock();
}
}

public void addOne() {
// 获取锁
rtl.lock();
try {
value = 1 + get();
} finally {
// 保证锁能释放
rtl.unlock();
}
}
}

参考

  • Java 并发编程实战