您好,欢迎来到网暖!

当前位置:网暖 » 站长资讯 » 建站基础 » 网络技术 » 文章详细 订阅RssFeed

浅析Java AQS同步器

来源:网络整理 浏览:293次 时间:2022-12-01


什么是AQS?

AQS(AbstractQueuedSynchronizer)是一个抽象队列同步器,位于juc.locks包下。abstract说明这是一个抽象类,通常抽象类已经帮我们完成了通用的功能,只需我们实现一些个性化方法即可,模板模式小套路。queued说明依赖FIFO队列,队列的实现方式是一个双向链表。synchronize说明是一个同步组件,可以用来完成多线程访问共享资源同步。





AQS原理?

AQS为每一个临界资源设置一个资源锁,需要访问临界资源的线程必须先获取资源锁,如果获取到了资源锁,便可以在线程中操作临界资源。如果没有获取到资源锁,则入队等待,等待上一个资源锁释放时,重新获取资源锁。许多同步类的实现内部都依赖于AQS,如ReentrantLock、CountDownLatch。





队列节点

节点记录了获取资源锁失败的线程、前驱节点、后继节点以及等待状态,多个线程都没有获取到资源锁时,会同时追加至队列尾部,AQS提供了基于CAS设置尾结点的方法:compareAndSetTail。首节点是获取资源锁成功的节点,首节点释放锁时会唤醒后继节点。





资源状态state

AQS维护了一个volatile int变量,用来标识当前状态,获取资源锁就是根据状态进行判断,基本操作就三个。




protected final int getState() {  return state;}protected final void setState(int newState) {  state = newState;}protected final boolean compareAndSetState(int expect, int update) {  return unsafe.compareAndSwapInt(this,stateOffset,expect,update);}






资源共享方式

AQS支持共享式(share)和独占式(exclusive),AQS只是同步组件,具体的获取释放都由实现组件完成。如ReentrantLock就是独占式,只能有一个线程获取临界资源;CountDownLatch就是共享式,多个线程可以依次获取门闩;当然AQS也支持读共享,写独占,如ReentrantReadWriteLock,读取时共享,写时独占。





总结

基于AQS我们可以实现自己的同步器,也可以参见ReentrantLock等组件的源代码。AQS已经为我们实现好获取资源锁失败入队、唤醒出队等操作,实现组件只需要完成根据状态获取锁、释放锁即可。


推荐站点

  • 腾讯腾讯

    腾讯网(www.QQ.com)是中国浏览量最大的中文门户网站,是腾讯公司推出的集新闻信息、互动社区、娱乐产品和基础服务为一体的大型综合门户网站。腾讯网服务于全球华人用户,致力成为最具传播力和互动性,权威、主流、时尚的互联网媒体平台。通过强大的实时新闻和全面深入的信息资讯服务,为中国数以亿计的互联网用户提供富有创意的网上新生活。

    www.qq.com
  • 搜狐搜狐

    搜狐网是全球最大的中文门户网站,为用户提供24小时不间断的最新资讯,及搜索、邮件等网络服务。内容包括全球热点事件、突发新闻、时事评论、热播影视剧、体育赛事、行业动态、生活服务信息,以及论坛、博客、微博、我的搜狐等互动空间。

    www.sohu.com
  • 网易网易

    网易是中国领先的互联网技术公司,为用户提供免费邮箱、游戏、搜索引擎服务,开设新闻、娱乐、体育等30多个内容频道,及博客、视频、论坛等互动交流,网聚人的力量。

    www.163.com
  • 新浪新浪

    新浪网为全球用户24小时提供全面及时的中文资讯,内容覆盖国内外突发新闻事件、体坛赛事、娱乐时尚、产业资讯、实用信息等,设有新闻、体育、娱乐、财经、科技、房产、汽车等30多个内容频道,同时开设博客、视频、论坛等自由互动交流空间。

    www.sina.com.cn
  • 百度一下百度一下

    百度一下,你就知道

    www.baidu.com