今天学习一下Java中lock的实现方式aqs
直接上图这是lock方法的实现类、分为公平锁和非公平锁两种。
先看非公平的实现方法、很暴力有木有,上来直接CAS(抢占锁的方法,是一个原子操作,没有学过的同学自行百度哦),如果抢占失败进入else方法,
这是else方法,进行了双&&短路运算符操作,咱们先从方法名去猜一猜,tryAcquire()这个方法应该是尝试去获取,如果返回false也就是获取不到才会去执行后面的acquireQueued(),看到这个queue我就联想到了aqs的数据结构双向等待队列。这些都是猜想,咱们继续看代码。
咱们接着看源码,这就是尝试获取锁调用的代码(非公平锁,公平锁等会看),if(c==0)表示锁未被占领然后就开始获取锁,获取成功返回true。else if表示当前获取锁的线程和持有锁的线程相等了,没错,这就是可重入锁了(可重入锁的好处就是不会发生死锁)。