关键

volatile int state :随子类定义什么意思

VarHandle

普通属性原子性操作
比反射快,直接操作二进制码

独占锁与共享锁

AQS中提供了两套锁机制: 共享锁与独占锁

  • 共享锁:

可以有多个线程同时执行, 线程执行个数也会受到state限制, 如Semaphore,CountDownLatch等等

  • 独占锁:

当前只有一个线程能够运行, 如ReentrantLock;
独占锁又分为公平锁(FairSync)和非公平锁(NonfairSync)

区别

tryAcquireShared是返回int,共享锁可以有多个状态
tryAcquire是返回boolen,独占锁只有true或者false

  1. // 独占锁
  2. if (p == head && tryAcquire(arg)) { // 区别-------
  3. setHead(node);
  4. p.next = null; // help GC
  5. failed = false;
  6. return interrupted;
  7. }
  8. // 共享锁
  9. if (p == head) {
  10. int r = tryAcquireShared(arg);
  11. if (r >= 0) { // 区别-------
  12. // 当该节点的前驱节点是头结点且成功获取同步状态
  13. setHeadAndPropagate(node, r);
  14. p.next = null; // help GC
  15. if (interrupted)
  16. selfInterrupt();
  17. failed = false;
  18. return;
  19. }
  20. }

**

公平锁: 所有线程严格按照FIFO占有锁.

  1. final void lock() {
  2. acquire(1);
  3. }

非公平锁: 每个线程不管是否有其他线程等待, 都会先尝试抢占锁, 抢占失败再去CLH队列中等待锁资源释放.

  1. final void lock() {
  2. if (compareAndSetState(0, 1))
  3. setExclusiveOwnerThread(Thread.currentThread());
  4. else
  5. acquire(1);
  6. }

tryAcquire: 独占如何获得锁
tryRelease: 独占如何释放锁
isHeldExclusively: 独占模式下查看当前线程是否获取同步资源
tryAcquireShared: 共享如何获得锁
tryReleaseShared: 共享如何释放锁

问题

为什么说AQS是通过volatile和CAS实现的
state是通过volatile修饰的,往队列加东西的时候,是用的CAS操作