ReentrantLock.Sync::tryLock源码笔记

// 尝试获取锁
// 尝试获取成功返回true
// 尝试获取失败返回false
final boolean tryLock() {
     Thread current = Thread.currentThread();
     int c = getState();
     // c == 0 说明当前锁处于闲置状态,尝试用CAS修改状态
     // 如果修改成功说明当前线程获取到锁
     if (c == 0) {
          if (compareAndSetState(0, 1)) {
               setExclusiveOwnerThread(current);
               return true;
          }
     // 当前线程已经是锁的持有者,此时进行重入逻辑
     } else if (getExclusiveOwnerThread() == current) {
          // 当c == Integer.MAX_VALUE 时++c会变成负数(-1)
          if (++c < 0) // overflow
               throw new Error("Maximum lock count exceeded");
          // 这里不需要cas,因为不可能同时有两个线程执行到这里
          setState(c);
          return true;
     }
     // 获取锁失败
     return false;
}

 

posted @ 2021-04-26 15:09  榆木脑袋0v0  阅读(77)  评论(0)    收藏  举报