一、实现方式
class X {
private final ReentrantLock lock = new ReentrantLock();
// ...
public void m() {
lock.lock(); // block until condition holds
try {
// ... method body
} finally {
lock.unlock()
}
}
}
复制代码
二、特点分析
1、锁类型是独占锁,默认非公平锁,可线程中断解除阻塞
2、公平锁和非公平锁本质区别:
非公平锁只要锁未被持有,即可以去获取(通过CAS设置标记获取),否则插入队列尾部(内部双向链表实现的队列)
公平锁当且仅当锁未被持有,且队列只有头结点情况(即队列为空)或者头结点线程就是当前线程,才可以去获取锁,否则插入队列尾部(内部双向链表实现的队列)
3、无论是公平锁还是非公平锁,如果当前占有锁的线程释放锁后,获取锁的顺序都是按照队列来进行获取(FIFO先加入队列的节点线程先获取锁)
4、内部阻塞和解除阻塞线程的API方法是
LockSupport.park(this);
LockSupport.unpark(s.thread);
5、 ConditionObject (即ReentrantLock.java类中newCondition返回的对象)对应独占锁可以调用的方法
await() 将当前节点加入阻塞队列,并阻塞当前线程
signal() 解除队列中下一个节点的阻塞
signalAll()解除队列中所有节点的阻塞
三、类结构分析
四、调用流程分析
1、lock方法调用后每次新加入节点,未获取锁,则加入阻塞队列,并阻塞当前线程
2、unlock方法调用后解除head节点后的一个节点的阻塞
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END