首页 > 社交 > 科普中国

Java中的AQS

常驻编辑 科普中国 2022-12-04 法名   队列   临界   节点   字段   共享资源   线程   变量   加锁   组件   核心   状态   基础   方法   资源   科技

什么是AQSNZo拜客生活常识网

AQS是AbstractQueuedSynchronizer(抽象队列同步器),并发包的一个基本组件,用来实现各种锁和各种同步组件。它包括并发中的核心组件,例如状态变量、锁定线程和等待队列。我们常用的ReentrantLock、CountDownLatch等基础类库都是基于AQS实现的。NZo拜客生活常识网


NZo拜客生活常识网

AQS原理及结构

AQS的核心思想是,如果请求的共享资源空闲,则将当前请求该资源的线程设置为有效的工作线程,并将共享资源设置为锁定状态;如果共享资源被占用,则通过基于双向链表的队列等待。NZo拜客生活常识网

AQS同步状态——状态。AQS维护了一个字段state,表示同步状态,由Volatile修饰,用于显示当前关键资源的锁状态。NZo拜客生活常识网


NZo拜客生活常识网

这里有几种访问该字段的方法:NZo拜客生活常识网

方法名称说明protectedfinalintgetState()intupdate)使用CAS更新ReentrantLock中的StateNZo拜客生活常识网


NZo拜客生活常识网

AQSNZo拜客生活常识网

ReentrantLock初始状态,AQS中的状态为0,加锁线程为null,然后调用lock方法以非公平锁作为一个示例:NZo拜客生活常识网

staticfinalclassNonfairSyncextendsSync{
privatestaticfinallongserialVersionUID=7316153563782823691L;
的
最终无效锁(){
如果(compareAndSetState(0,1))
setExclusiveOwnerThread(Thread.currentThread());
别的
获取(1);
}
的protectedfinalbooleantryAcquire(intacquires){
返回非公平尝试获取(获取);
}
}

CAS将状态变为1,锁定线程成为调用线程。当这个线程来锁定状态时,就会变成2,其他的调用会被封装到一个线程节点中,进入等待队列。NZo拜客生活常识网


NZo拜客生活常识网

再看ReentrantLock调用解锁方法NZo拜客生活常识网

publicvoidunlock(){
同步。发布(1);
}

调用AQS的release方法NZo拜客生活常识网

publicfinalbooleanrelease(intarg){
如果(tryRelease(arg)){
节点h=头;
如果(h!=null&&h.waitStatus!=0)
unparkSuccessor(h);
返回真;
}
返回假;
}

其实tryRelease会调用setState方法将状态数减一。如果状态值为0,锁将被完全释放,“锁定线程”变量也将被设置为null。接下来,它将从等待队列开始。队列的头部唤醒线程2并尝试再次锁定。其实就是这么多逻辑,大家也可以看看源码,看看是怎么实现的。NZo拜客生活常识网


NZo拜客生活常识网

参考

https://mp.weixin.qq.com/s/s/sA01gxC4EbgypCsQt5pVogNZo拜客生活常识网

https://mp.weixin.qq.com/s/zdn54VeNSsabwD3CBd3CBvSoANZo拜客生活常识网


NZo拜客生活常识网

关注♷:蜜蜂科技窝了解更多知识NZo拜客生活常识网

相关阅读:

  • 释小龙的女儿疑似现身,长相如同复制粘贴,网友:基因太强大
  • 姆巴佩新闻 姆巴佩 国家队 法国国家队为什么没有姆巴
  • 僧人起名也排“辈”,你知道这些宗派怎么排的吗
  • 原来僧人起名也排“辈”,你知道这些宗派怎么排的吗?
  • 25
  • SpringBoot整合RabbitMQ实战附加死信交换机
  • 走进孩子的幻想世界
  • 节约!王楠6岁女儿军训,吃饭胃口好,土豆丝掉桌上拾起来吃
  • 暗黑2重制版:为啥打怪没伤害?NHD到底是啥?亲女儿特殊的光
  • 新英雄海月上线体验服,强势跻身法刺队列
    • 网站地图 |
    • 声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。文章内容仅供参考,不做权威认证,如若验证其真实性,请咨询相关权威专业人士。