Java面试八股之AQS对资源的共享方式

  1. 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站:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值