> For the complete documentation index, see [llms.txt](https://lxs-shmily.gitbook.io/java-notes/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://lxs-shmily.gitbook.io/java-notes/java-bing-fa/aqs-yuan-li.md).

# AQS

![AQS](https://26655177-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LnRJnRZvnPN4YODatVc%2F-LnRKCahBuzozjyas4_h%2F-LnRLnfTq3KDWff36kSI%2FAQS.jpg?generation=1567065066044908\&alt=media)

利用 一个FIFO的双向循环队列 和一个volatile关键字修饰的变量state实现

不同的自定义同步器争用共享资源的方式也不同。自定义同步器在实现时只 需要实现共享资源state的获取与释放方式即可，至于具体线程等待队列的 维护（如获取资源失败入队/唤醒出队等），AQS已经在顶层实现好了。 自定义同步器实现时主要实现以下几种方法：

* isHeldExclusively()：该线程是否正在独占资源。

  &#x20; 只有用到condition才需要去实现它。
* tryAcquire(int)：独占方式。尝试获取资源，成功则返回true，

  失败则返回false。
* tryRelease(int)：独占方式。尝试释放资源，成功则返回true，

  失败则返回false。
* tryAcquireShared(int)：共享方式。尝试获取资源。

  负数表示失败；0表示成功，但没有剩余可用资源；正数表示成功，且有剩余资源。
* tryReleaseShared(int)：共享方式。尝试释放资源，

  &#x20;如果释放后允许唤醒后续等待结点返回true，否则返回false。

> [利用CAS 实现](/java-notes/java-bing-fa/cas.md)

详细介绍[ReenTranLock](/java-notes/java-xian-cheng/reentrantlock.md)

\[<http://www.cnblogs.com/waterystone/p/4920797.html][参考博客>]

\[参考博客]: <http://www.cnblogs.com/waterystone/p/4920797.html>
