- AQS对资源的共享方式
AQS设计了一套灵活的机制,不仅支持独占(Exclusive)锁模式,也支持共享(Shared)锁模式,使得资源可以被一个或者多个线程以不同的方式访问。这两种模式通过控制一个内部的volatile int类型的state变量来实现对资源的管理和协调。
独占锁模式:
在独占锁模式下,如ReentrantLock,同一时刻只允许一个线程持有锁。线程尝试获取锁时,会尝试将state从0变为1,表示锁被占用。当线程释放锁时,会将state减回到0,表明锁被释放。
共享锁模式:
共享锁允许多个线程同时访问资源,典型的实现如ReentrantReadWriteLock的读锁。在这种模式下,state变量不仅仅是表示是否锁定,还可以表示有多少个线程正在共享资源。例如,在读锁中,每增加一个读取者,state值可能增加一个固定量(如1),表示共享计数的增加。当线程释放共享锁时,state相应减少,而不是直接归零,直到所有共享锁都被释放,state才回到表示未锁定的状态。
实现原理:
获取共享锁: 通过tryAcquireShared()方法尝试获取共享资源。该方法需要由子类实现,它会检查当前状态并决定是否允许当前线程进行共享访问。如果成功,返回大于0的值;如果不成功,返回负值。
释放共享锁: 通过tryReleaseShared()方法释放共享资源。同样由子类实现,负责减少共享状态计数,并在必要时唤醒等待的线程。
等待队列管理: 不论是独占还是共享模式,AQS都使用一个FIFO线程等待队列来管理那些因为无法立即获取锁而需要等待的线程。在共享模式下,等待的线程可能需要根据state的变化和特定的信号机制被唤醒。
如果大家需要视频版本的讲解,欢迎关注我的B站: