AQS数据结构及实现原理?

AQS是一个同步器,核心数据结构是双向链表+state(锁状态)

  1. 提供了一种框架,自定义了先进先出的同步队列,让获取不到锁的线程能进入同步队列中排队;
  2. 同步器有个状态字段,我们可以通过状态字段来判断能否得到锁,此时设计的关键在于通过把状态声明为 volatile,在锁里面修改状态值来保证线程安全的;
  3. 子类可以通过给状态 CAS 赋值来决定能否拿到锁,比如定义状态值是 0 可以获得锁,状态值是 1 就获取不到锁;
  4. 子类可以新建非 public 的内部类来继承 AQS,从而实现锁的功能;
  5. AQS 提供了排它模式和共享模式两种锁模式。排它模式下:只有一个线程可以获得锁,共享模式可以让多个线程获得锁,子类 ReadWriteLock 实现了两种模式;
  6. 内部类 ConditionObject 可以被用作 Condition,我们通过 new ConditionObject () 即可得到条件队列;
  7. AQS 实现了锁、排队、锁队列等框架,至于如何获得锁、释放锁的代码并没有实现,比如 tryAcquire、tryRelease、tryAcquireShared、tryReleaseShared、isHeldExclusively 这些方法,AQS 中默认抛 UnsupportedOperationException 异常,都是需要子类去实现的;
  8. AQS 继承 AbstractOwnableSynchronizer 是为了方便跟踪获得锁的线程,可以帮助监控和诊断工具识别是哪些线程持有了锁;
  9. AQS 同步队列和条件队列,获取不到锁的节点在入队时是先进先出,但被唤醒时,可能并不会按照先进先出的顺序执行。

你可能感兴趣的:(底层原理与面试)