ReentrantLock原理——AQS

AQS原理

  1. AQS,AbstractQueuedSynchronizer,抽象同步器队列,用来处理多线程访问资源的工具队列,具体依赖他的类有:ReentrantLock、Semaphore、CountDownLatch、CycilBarrier等。
  2. 虽然叫做abstract也是一个抽象类,但是类中所有的方法都是实现的,在需要的时候我们只重写需要的方法即可。
  3. 工作机制:维护一个链表队列,这些队列的结点通过独占或共享两种模式去访问资源,这个资源往往是一个对锁数量的计数,可以获取、通过CAS设置资源的信息。我们实际上就是重写在独占和共享两种模式下获取和释放资源,一共的这四种方法。其他的比如用CAS保持入队、唤醒机制等都是由AQS直接封装好,我们不再关心。
  4. AQS顶层的调用方法是acquire和release方法,acquire方法先tryAcquire尝试能否直接操作,否则将其加入队列阻塞操作,返回结果,其中遇到中断会在内部处理中断请求。release则调用具体的tryRelease进行释放操作,tryRelease返回布尔值表示是否释放了当前线程对资源的控制。


ReentrantLock 原理

ReengrantLock中有一个abstract static 修饰的内部类,Sync,这个类继承了AQS抽象类。内部还有两个类,一个是FairSync,另一个是NonfairSync这两个类都继承了Sync,但是分别对入队的操作进行了不一样的编写,非公平的话会有一个直接抢占的过程,如果刚进去的时候正好没有人使用资源,他就直接使用,而公平锁不存在这样的机制。个人认为是AQS的构造导致了公平锁的出现,但是公平锁效率不高。

Semaphore

某项资源最多同时并发n个,可以供n个线程同时获取。可以看作是Lock的一种增强版。

CyclicBarrier

指定一定数量的线程,当且仅当这些线程同时达到一个点的时候才能同时进行下一步,否则线程会阻塞。如果线程数少于指定的线程数量则会一直阻塞,如果线程数大于指定的线程数,则其中先到的线程能够进行,剩余的线程继续阻塞。

CountDownLatch

可以实现类似计数器的功能,当n个线程都执行完毕时,才开始执行某个线程。

线程状态转换



猜你喜欢

转载自blog.csdn.net/quinnnorris/article/details/81042327