25张图带你深入了解AQS
AQS实现原理 AQS中 维护了一个volatile int state(代表共享资源)和一个FIFO线程等待队列(多线程争用资源被阻塞时会进入此队列)。 这里volatile能够保证多线程下的可见性,当state=1则代表当前对象锁已经被占有,其他线程来加锁时则会失败,加锁失败的线程会被放入一个FIFO的等待队列中,比列会被UNSAFE.park()操作挂起,等待其他获取锁的线程释放锁才能够被唤醒。 另外state的操作都是通过CAS来保证其并发修改的安全性。 具体原理我们可以用一张图来简单概括: AQS 中提供了很多关于锁的实现方法, getState():获取锁的标志state值 setState():设置锁的标志state值 tryAcquire(int):独占方式获取锁。尝试获取资源,成功则返回true,失败则返回false。 tryRelease(int):独占方式释放锁。尝试释放资源,成功则返回true,失败则返回false。 这里还有一些方法并没有列出来,接下来我们以ReentrantLock作为突破点通过源码和画图的形式一步步了解AQS内部实现原理。 目录结构 文章准备模拟多线程竞争锁、释放锁的场景来进行分析AQS源码: 三个线程(线程一、线程二、线程三)同时来加锁/释放锁 目录如下: 线程一加锁成功时AQS内部实现 线程二/三加锁失败时AQS中等待队列的数据模型