reentrantlock

Reentrantlock

    • 实现机制
    • 交替的情况加锁(源码)
      • 非公平锁
      • 公平锁
    • 重入锁的源码实现

实现机制

内部使用aqs,park,unpark,cms来实现加锁过程,如果是单线程或者是线程间的交替执行则与aqs队列无关,不会进行任务线程的存储,直接获取锁.

交替的情况加锁(源码)

非公平锁

设置断点进入lock方法
reentrantlock_第1张图片
1.调用sync 的lock()方法
在这里插入图片描述
2.默认调用实现sync的非公平锁的类中的lock()方法
reentrantlock_第2张图片
直接通过cms修改state变量
在这里插入图片描述

3.获取锁之后设置当前执行的线程
在这里插入图片描述
然后返回继续执行方法
reentrantlock_第3张图片

公平锁

设置断点进入lock方法
reentrantlock_第4张图片
1.调用sync 的lock()方法
在这里插入图片描述
2.进入公平锁的类中的lock()方法

3.进入lock中的acquare()方法
reentrantlock_第5张图片
4.进入acquare()中的tryAcquare()方法然后获取state是否为0若为0则说明锁空闲,然后判断aqs队列是否为空,若为空则使用cms修改state的值
reentrantlock_第6张图片
5.根据aqs队列的头尾节点是否相同来判断是否为空
reentrantlock_第7张图片
6.为空则加锁逐步返回继续执行锁中的代码.

重入锁的源码实现

reentrantlock_第8张图片

  • **current == getExclusiveOwnerThread()**这个判断当前持有锁的线程的当前获取锁的线程是否为同一个线程,
  • 如果是得话就nextc+1,然后将nextc设置给stare(setState(nextc))
  • nextc默认大于0,如果小于0则报异常.(throw new Error(“Maximum lock count exceeded”);)

你可能感兴趣的:(并发编程)