新闻资讯

新闻资讯 行业动态

AQS是什么?为什么需要AQS?

编辑:008     时间:2020-02-18

一、 AQS是什么?

1.1 介绍:

AQS(Abstracting Queue Sychronizer),望文生义,即一个抽象队列 + 一个需要同步的状态,所谓抽象队列即这个队列并不是真是存在的(通俗的讲,不是一个LinkedList对象),而是像HashMap中的链表一样,只存在Node之间的关系中,每个Node负责维护前置与后置节点,以及持有一个请求线程(可以理解为将一个请求线程封装成Node);

1.2 为什么通过上述的方式实现:

  1. 为什么不可以通过LinkedList去维护呢?原因是在多线程尾插List时线程不安全,我们都知道LinkedList并不是一个线程安全的类,所以AQS采用了CAS+死循环的方式实现了插入的串行化,不知道在看的你看没看过 《高性能Mysql》 ,其中就提到一个邮箱系统,其实与这个场景类似,在事务隔离级别为第四级串行化时是可以保证线程安全的;
  2. 共享的状态是什么?是一个Volatile值,用Volatile保证每个请求的线程都可以看见当前最新的状态,以免产生线程冲突;
/**
     * The synchronization state.
     */
    private volatile int state; 

这个值当你自己去实现锁的时候你可以自己定义规则, 《Java并发编程的艺术》 一书中自己定义了一个可以同时被两个线程持有的锁(共享式),并且将state值设置为2,每当有一个线程获取到锁后,将该值减1,当state值再减去一便小于零时,这个线程便只能加入同步队列并且开始自旋等待锁。

二、为什么需要AQS?

  1. 因为安全的在多线程下访问共享资源的需求在JAVA1.5的时候愈演愈烈,所以架包的实现者就想提供一个可以实现同步的基础框架; AQS(Abstracting Queue Sychronizer)面向的是锁的实现者,它简化了实现锁的方式,屏蔽了同步状态管理,FIFO队列管理,线程的等待与唤醒等底层操作,让锁的实现者更多的去关注锁需要实现的功能,并通过模板设计模式提供了比较好的灵活性;而锁是面向使用者的,它定义了使用者与锁交互的接口,隐藏了实现的细节。

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

回复列表

相关推荐