ReentrantLock是一种基于AQS框架的应用实现,AQS 是核心思想。
第一 、自旋 while(true)
第二 、加锁 保证只有一个线程可以拿到锁,其他线程一直在自旋的循环中等待,CAS 加锁 compare and swap
第三 、用队列实现公平或非公平锁
第四 、LockSupport park、unpark实现阻塞
伪代码
//加锁 //第一 自旋 while(true){ //第二 CAS 加锁 if (unsafe.compareAndSwapInt(,,,)){ //加锁成功 break; //加锁成功的跳出循环 } //将block的线程加入队列,以实现公平非公平锁 //第三 queue 记录需要加锁的线程 HashSet.linkedQueue.add(thread); //第四 利用park block 线程 LockSupport.park();//加锁失败的在此等待 } //解锁 LockSupport.unpark(thread);