AQS机制

AQS(AbstractQueuedSynchronizer)是Java并发包中用于构建锁和同步器的基础框架,它使用volatile变量state管理和FIFO等待队列来协调多线程同步。tryAcquire方法尝试获取锁,若失败则通过acquire方法进入等待队列。acquireQueued方法将线程加入等待队列并尝试获取锁。此机制确保了线程安全和公平性。
摘要由CSDN通过智能技术生成

全称为:AbstractQueuedSynchronizer

属性部分:

   private volatile int state;

通过volatile保证state可见性,int实现非独占锁。

    private transient volatile Node head;

    private transient volatile Node tail;

放排队等待线程的 队列(FIFO) 的 头结点和尾结点
 

如何利用state和FIFO等待队列来管理多线程的同步状态?

应该实现的两个操作:

1. 尝试获取锁(修改标记位),立即返回 ===== > tryAcquire

    protected boolean tryAcquire(int arg) {
        throw new UnsupportedOperationException();
    }
  • 传入int型参数,表示对state的修改;
  • 返回boolean型参数,表示修改是否成功;

表示如果想继承AQS类,就可以重写该方法,不然就会返回不支持的异常。


2. 获取锁(修改标记位),愿意进入队列等待,直到获取 ===== >acquire

    public final void acquire(int arg) {
        if (!tryAcquire(arg) &&
            acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
            selfInterrupt();
    }

final修饰:所有继承类都直接调用这个方法,并且不能被override

  • tryAcquire:如果能直接获取锁,则跳出
  • acquireQueued方法:
  •  addWaiter:将当前线程封装为一个Node,并加入等待队列,返回值为新建的结点对象。
  • acquireQueued方法:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值