ReentrantLock源码

可重入锁

Lock的实现类都是通过 聚合了一个同步队列的子类来 实现线程访问的控制

类基本结构

方法


非公平锁的lock先自旋一次,成功就获取锁,失败再正常获取

tryAcquire调用父类Sync的非公平获取方法

公平锁的lock,与非公平锁的唯一区别就是多了个hasQueuePredecessors()方法判断等待队列是否有有效节点

释放锁的流程,因为是可重入锁,会通过state判断是否为0来决定是否释放锁

ReentrantLock的上锁流程

非公平锁:总的来说就两bu:每个线程都会尝试获取锁,获取锁失败就进入阻塞队列

    * <font style="color:rgb(0, 0, 0);">一开始会先通过CAS操作判断是否可以把state从0改为1,如果可以,则表示加锁成功,并通过set</font><font style="color:rgb(37, 41, 51);">ExclusiveThread()将exclusiveThread设置为当前线程</font><font style="color:rgb(0, 0, 0);">;</font>
    * <font style="color:rgb(0, 0, 0);">cas操作不成功,那么就会进入acquire(1)方法 </font>
    * <font style="color:rgb(0, 0, 0);">然后回进入tryAcquire方法,这时候还是会通过CAS去获取锁,看看getState是否为0,如果			</font>

公平锁:不管3721,都给我先入队列

    * 

为什么ReentrantLock,synchronized默认要为非公平锁

提升锁竞争的性能,如果是公平锁的话,往往要比非公平锁多出一个进入队列阻塞等待,然后再被唤醒。这会

涉及到一个内核态的切换,这对性能是有很大影响。而非公平锁的话,当前线程正好处于上一个线程释放锁时

的临界点,也就意味着当前线程不需要切换到内核态,虽然说对等待中的线程不公平,但这大大提高了锁竞争

时的性能