重入锁是java级别的锁。查看重入锁源码还是应该先阅读AbstractQueuedSynchronizer源码。
AbstractQueuedSynchronizer解析(1)
AbstractQueuedSynchronizer解析(2)
ReentrantLock类概述
互斥的重入锁,与sychronized拥有相同的行为,但是它也有扩展的功能。最后一个持有锁的线程拥有重入锁。线程通过调用lock方法获取重入锁。如果当前线程已经持有锁将立刻返回。可以通过调用isHeldByCurrentThread方法检查锁是否被占有。
这个类的构造器允许传入fairness参数。设置这个参数为true的时候,等待锁时间最长的线程将得到获取锁的权利。否则不会保证特定的获取锁的顺序。公平锁的性能会稍微低一点,但是它会保证每个线程都不会处于饥饿现象。机制一点,公平锁平不能保证线程按照计划的顺序执行。
重入锁最多可以被同一个线程2147483647递归持有(每次持有锁都不释放锁)
非公平锁获取锁
1 |
|
非公平锁tryAcquire的业务逻辑由nonfairTryAcquire实现
1 |
|
公平锁获取锁
1 |
|
释放锁
只有持有锁的线程才能释放锁,改变state字段。
1 |
|