阅读 107

锁分析下-ReentrantLock锁分析

一、实现方式


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.JPG

四、调用流程分析

流程.JPG 1、lock方法调用后每次新加入节点,未获取锁,则加入阻塞队列,并阻塞当前线程

2、unlock方法调用后解除head节点后的一个节点的阻塞

文章分类
Android
文章标签