synchronized实现可重入锁的方式是一个counter计数器,一个线程重复加锁(moniter enter)的话那么counter + 1,释放锁(moniter exit) 就让counter - 1,直到变为0。
AQS中的可重入锁实现方式同synchronized类似,用的是资源变量state来维护加锁的次数。并且这个state是volatile修饰的。
下面是非公平锁的加锁方法。
可以看到如果当前线程是持有资源的那个线程,那么将加锁次数对state变量进行累加,并通过CAS操作写回state。
比较有趣的是nextc < 0会抛出一个超出最大加锁次数限制(int最大值)的异常,可以构造一个比int还大的数让state溢出,让它出现这个错误。
不知道synchronized的可重复加锁次数上限是多少🏀🐔🥲。