java简单AQS使用

AQS是一种并发数据结构,

  1. volatile int state
  2. blockingQueue工作队列

以acquire为例分析相关代码

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

}

tryAcquire()-以ReentrantLock的nonfairTryAcquire(int acquire)为例

获取当前state
if(state==0){
  无人占用,则通过cas改变state状态,
  成功后,重新设置锁的所有者;
  return true;
}else{
  if(当前线程=锁的所有者){
     state+=1;设置state;
	 return true;
  }
  return false;
}

acquireQueued方法

final boolean acquireQueued(final Node node, int arg) {
      boolean interrupted = false;
      try {
    	for (;;) {// 循环
        	final Node p = node.predecessor();// 获取前一个节点
        	if (p == head && tryAcquire(arg)) { // 如果前一个节点是头结点,表示当前节点合适去 tryAcquire
            	setHead(node); // acquire 成功,则设置新的头节点
            	p.next = null; // 将前面节点对当前节点的引用清空
            	return interrupted;
        	}
        	if (shouldParkAfterFailedAcquire(p, node)) // 检查是否失败后需要 park
            	interrupted |= parkAndCheckInterrupt();
    	}
       } catch (Throwable t) {
    	cancelAcquire(node);// 出现异常,取消
    	if (interrupted)
        	    selfInterrupt();
    	throw t;
      }
}

  • 循环判断,主要是当本节点成为表头的下一个元素时,去抢占锁,如果成功,则返回结果,停止循环;
  • 获取锁不成功,就查看队列是否已满/已取消.需要不需要中断获取锁的线程;
  • 捕获异常,判断,如果interrupted为true,中断线程

转载于:https://my.oschina.net/u/1590027/blog/3052405

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: AQS (AbstractQueuedSynchronizer) 是 Java 中的一种用于实现同步器的抽象类。它提供了一种通用的机制,用于实现同步工具(如锁、信号量和闭锁),而不需要编写底层同步代码。AQS 实现了一个队列,用于在多个线程之间安全地传递同步状态。 ### 回答2: AQS(AbstractQueuedSynchronizer,即抽象队列同步器)是Java中用于实现同步机制的基础类。它提供了一种在同步状态下等待/通知的机制,并支持独占和共享两种同步方式。 AQS基于一个先进先出(FIFO)的双向队列,被称为等待队列,来存储等待获取同步状态的线程。每个线程在申请获取同步状态时会被加入到等待队列的尾部,同时被阻塞。当同步状态可用时,只有队列头部的线程才能获取到同步状态,并被唤醒继续执行。 AQS采用了模板方法设计模式,提供了独占模式下的acquire和release方法以及共享模式下的acquireShared和releaseShared方法。具体的同步实现逻辑由子类来实现。 在AQS中,同步状态(state)是通过一个int类型的变量来表示,而具体的同步语义由子类中的实现方法来定义。AQS利用CAS(Compare and Swap)操作来保证同步状态的原子操作,这也是保证AQS实现的线程安全性的基础。 除了同步的基本功能,AQS还提供了一些扩展方法,如条件队列的支持,子类可以通过实现Condition接口来创建自己的条件队列。 总之,AQSJava中基于队列的同步控制机制的基础类,它通过一种等待/通知的机制实现线程间的同步和通信,提供了独占模式和共享模式的支持,是Java并发编程中非常重要的一个类。 ### 回答3: AQS (AbstractQueuedSynchronizer) 是 Java 中用于构建同步器的基础框架。它提供了一套简单且灵活的实现方式,可用于构建各种类型的同步器,如锁、信号量、倒计时门栓等。 AQS 的核心是一个等待队列,用于管理等待获取同步状态的线程。它通过内部的 node 对象来表示每个线程,并使用 CAS 操作来实现线程的安全操作。当一个线程需要获取同步状态时,它会在等待队列中插入一个 node,并进入自旋或阻塞等待其他线程的唤醒。当某个线程释放同步状态时,AQS 会将状态转移给队列中的下一个等待线程。 AQS 为具体的同步器提供了两种操作:获取同步状态和释放同步状态。获取同步状态的方式一般有两种:独占方式 (Exclusive) 和共享方式 (Shared)。独占方式是指同一时间只能有一个线程获取同步状态,如 ReentrantLock;共享方式是指多个线程可以同时获取同步状态,如 CountDownLatch。 AQS 的实现基于模板方法设计模式,使用了一个 state 成员变量来表示同步状态。具体的同步器需要继承并实现 AQS 的抽象方法,包括获取同步状态的方法 (tryAcquire、tryAcquireShared) 和释放同步状态的方法 (tryRelease、tryReleaseShared)。通过重写这些方法,可以定制实现特定的同步逻辑。 总而言之,AQSJava 中用于构建同步器的基础框架,通过等待队列和内部的 node 对象来管理线程的获取和释放同步状态。它提供了一套简单且灵活的实现方式,并支持独占和共享两种同步方式。通过继承并实现 AQS 的抽象方法,可以定制实现各种类型的同步器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值