您的位置:首页 > 汽车 > 时评 > Java面试八股之AQS对资源的共享方式

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

2024/11/18 7:25:26 来源:https://blog.csdn.net/u012151345/article/details/139246912  浏览:    关键词: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站:

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com