并发编程 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. 可重入锁
具体请看:
5. 公平锁与非公平锁
对于公平锁,线程获取锁时会按照等待时间长短享有不同的优先级,当锁被释放后,等待时间最长的线程便可以获取锁。
ReentrantLock 允许传入一个可选的 “公平与否” 参数,用于设置该锁的公平与否。
6. 读写锁
具体请看:
7. 改进的读写锁
具体请看:
参考
- Java 并发编程实战