Java并发包下的ReentrantLock(可重入锁),实现了高并发下的加锁机制,原理是通过AQS(
AbstractQueuedSynchronizer,抽象的队列同步器)中循环调用CAS(compareAndSet,原子性操作)操作来实现加锁,它的性能比较好是因为尽最大努力的避免了使线程进入内核态的阻塞状态,Java并发包下的很多锁功能,本质都是使用了AQS(AbstractQueuedSynchronizer,抽象的队列同步器),该实现的作者是Doug Lea,ThreadPoolExecutor线程池也是这位外国大佬的杰作。
先看一下ReentrantLock(可重入锁)的类结构,如下图:
ReentrantLock(可重入锁)的类结构
ReentrantLock类包含三个内部类,分别是NonfairSync(非公平锁),FairSync(公平锁),Sync(同步器),其中Sync(同步器)又继承了
AbstractQueuedSynchronizer(AQS),本质也是由AQS实现了绝大部分的锁功能。
实例化创建公平锁和非公平锁,默认创建非公平锁。
实例化创建公平锁和非公平锁
公平锁和非公平锁的差别在于:
公平锁:先请求锁的线