并发编程 Lock

本文将介绍 JUC 中的 Lock。

一、什么是 Lock?

Lock 是并发编程中的一个接口,实现了管程中的锁。

二、特点

1. 可以被抢占

在 synchronized 中,线程获取锁,如果锁已被占据,线程将会进入阻塞状态,并且无法被 interrupt() 方法中断。假如此时线程已经占有了某些锁,这些锁将会被线程 “霸占”,陪它一起阻塞。

1
2
3
4
5
6
synchronized (A) {
// 如果申请不到B的锁,线程带着A的锁阻塞
synchronized (B) {

}
}

JUC 提供了 lockInterruptibly(),它和 lock() 一样用于加锁,并且也会锁被占据时阻塞,但它是可以被中断的。

2. 支持超时获取锁

JUC 提供了 try(long time) 方法,允许设置获取锁的超时时间。

3. 支持非阻塞式获取锁

JUC 提供了 tryLock() 方法,该方法将在锁空闲时才获取,否则返回 false 且什么都不执行。

1
2
3
4
5
6
Lock lock = ...;
if (lock.tryLock()) {
// 已获取到锁
} else {

}

4. 可重入锁

具体请看:

并发编程 ReentrantLock

5. 公平锁与非公平锁

对于公平锁,线程获取锁时会按照等待时间长短享有不同的优先级,当锁被释放后,等待时间最长的线程便可以获取锁。

ReentrantLock 允许传入一个可选的 “公平与否” 参数,用于设置该锁的公平与否。

6. 读写锁

具体请看:

并发编程 ReadWriteLock

7. 改进的读写锁

具体请看:

并发编程 StampedLock

参考

  • Java 并发编程实战