解答
以非公平锁为例,通过 nonfairTryAcquire 方法获取锁,该方法增加了再次获取同步状态的处理逻辑:
判断当前线程是否为获取锁的线程来决定获取是否成功,如果是获取锁的线程再次请求则将同步状态值增加并返回 true,表示获取同步状态成功。
成功获取锁的线程再次获取锁将增加同步状态值,释放同步状态时将减少同步状态值。
如果锁被获取了 n 次,那么前 n-1 次 tryRelease 方法必须都返回 fasle,只有同步状态完全释放才能返回 true,该方法将同步状态是否为 0 作为最终释放条件,释放时将占有线程设置为null 并返回 true。
对于非公平锁只要 CAS 设置同步状态成功则表示当前线程获取了锁,而公平锁则不同。
公平锁使用 tryAcquire 方法,该方法与nonfairTryAcquire 的唯一区别就是判断条件中多了对同步队列中当前节点是否有前驱节点的判断,如果该方法返回 true 表示有线程比当前线程更早请求锁,因此需要等待前驱线程获取并释放锁后才能获取锁。
不错不错,点赞收藏了
只会写初级sql的我看不大懂
感觉文章思路挺清晰的~