可重入锁
表示支持一个线程对某个资源进行重复加锁
ReentrantLock也是通过实现Lock接口并在内部聚合一个同步器来实现的,且支持公平和非公平性获取锁。所谓公平性获取锁指在同步队列中靠前的等待线程会先获得锁。
public class ReentrantLock implements Lock, java.io.Serializable { private static final long serialVersionUID = 7373984872572414699L; private final Sync sync; abstract static class Sync extends AbstractQueuedSynchronizer { final boolean nonfairTryAcquire(int acquires) {...} protected final boolean tryRelease(int releases) {...} ... } static final class NonfairSync extends Sync {...} static final class FairSync extends Sync {...} }
非公平性获取锁
每个线程都会以CAS方式更改state值以获取锁,且函数会接受一个int值表示获取锁的数量。
可以看出,如果state为0,表示没有线程持有锁,直接进行获取锁操作,若state不为0,则检查持有锁的线程是否为本线程,若是,则可以重复加锁,这就实现了可重入的功能。
final boolean nonfairTryAcquire(int acquires) { final Thread current = Thread.curren