ReentrantLock的底层是aqs,aqs的加锁是通过CAS操作的, 因为aqs大量使用CAS所以性能比syncionzed的性能好很多

AQS图解
image.png
ReentrantLock的底层是Sync这个类 Sync是AQS的子类

  1. public ReentrantLock() {
  2. sync = new NonfairSync();
  3. }

lock()的底层还是CAS

cas可以无锁化的保证原子性

  1. final void lock() {
  2. //如果加锁成功 cas操作使得state变为1.
  3. if (compareAndSetState(0, 1))
  4. //独占锁
  5. setExclusiveOwnerThread(Thread.currentThread());
  6. else
  7. //如果state!=1 健壮性考虑,防止其他线程释放锁
  8. acquire(1);
  9. }
  10. //如果state!=1
  11. public final void acquire(int arg) {
  12. if (!tryAcquire(arg) &&
  13. acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
  14. selfInterrupt();
  15. }
  16. protected final boolean tryAcquire(int acquires) {
  17. return nonfairTryAcquire(acquires);
  18. }
  19. final boolean nonfairTryAcquire(int acquires) {
  20. final Thread current = Thread.currentThread();
  21. int c = getState();
  22. if (c == 0) {
  23. if (compareAndSetState(0, acquires)) {
  24. setExclusiveOwnerThread(current);
  25. return true;
  26. }
  27. }
  28. //代表了线程在可重入的加锁
  29. else if (current == getExclusiveOwnerThread()) {
  30. int nextc = c + acquires;
  31. if (nextc < 0) // overflow
  32. throw new Error("Maximum lock count exceeded");
  33. setState(nextc);
  34. return true;
  35. }
  36. return false;
  37. }

底层还是基于unsafe
image.png