什么是AQS?AQS如何实现可重入锁 ?

AQS(AbstractQueuedSynchronizer,抽象队列同步器)是Java并发包中用于构建同步器的框枥。AQS是Lock和其他同步工具的基础,在ReentrantLock和CountDownLatch等同步器中都有应用。

AQS的核心思想是,如果一个线程在获取同步状态时失败,它会被构造成一个节点,然后被放置在一个队列中。这样其他正在争用同步状态的线程就可以看到队列中的结点,然后以FIFO的顺序获得同步状态。AQS通过内置的FIFO队列来完成等待队列的管理。AQS提供了两个队列,一个是同步队列,另一个是条件队列。

对于可重入锁,AQS的实现使用了一个名为state的volatile变量来表示同步状态。当某一线程获取了锁,state值会发生变化,当再次获取锁时,state会自增;当释放锁时,state会自减。这样就实现了可重入锁的特性。

要实现可重入锁,AQS需要维护当前占有锁的线程以及其重入的次数。通常可以通过将Thread和state的值进行关联来实现。线程第一次获取到锁时,state增加计数;线程再次获取锁时,如果当前线程已经持有锁,只需将计数加1,而不必再次竞争锁。在释放锁时,计数量会相应减少,当计数减为0时,表示释放了锁。

ReentrantLock就是基于AQS实现的一个可重入锁,通过AQS的状态值和线程关联机制,实现了可重入锁的功能。

总之,AQS提供了一种基于FIFO队列+volatile变量state的支持可重入锁的框枥,具备灵活性和高性能,并且可以为基于AQS的同步工具提供更高的并发性。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值