标签 ‘ aqs

透过CountDownLatch窥探AQS

本文来自公众号“Kahuna”,可搜索Alitaba119,欢迎关注,转载请注明出处,非常感谢


 A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes.

这是CountDownLatch这个类要解决的问题:实现一个同步器,让一个或者多个线程一直等待,直到一组在其他线程中执行的操作完成。

阅读全文

源码剖析AQS在几个同步工具类中的使用

感谢网友【张超盟】的投稿

1. 前言

AQS(AbstractQueuedSynchronizer)是 java.util.concurrent的基础。J.U.C中宣传的封装良好的同步工具类SemaphoreCountDownLatchReentrantLockReentrantReadWriteLockFutureTask等虽然各自都有不同特征,但是简单看一下源码,每个类内部都包含一个如下的内部类定义:

[code lang=”java”] abstract static class Sync extends AbstractQueuedSynchronizer [/code]

阅读全文

The j.u.c Synchronizer Framework翻译(三)使用、性能与总结

原文链接 作者:Doug Lea 译者:欧振聪 校对:丁一

4 用法

AQS类将上述的功能结合到一起,并且作为一种基于“模版方法模式”[6]的基类提供给同步器。子类只需定义状态的检查与更新相关的方法,这些方法控制着acquire和 release操作。然而,将AQS的子类作为同步器ADT并不适合,因为这个类必须提供方法在内部控制acquire和release的规则,这些都不应该被用户所看到。所有java.util.concurrent包中的同步器类都声明了一个私有的继承了AbstractQueuedSynchronizer的内部类,并且把所有同步方法都委托给这个内部类。这样各个同步器类的公开方法就可以使用适合自己的名称。 阅读全文

The j.u.c Synchronizer Framework翻译(二)设计与实现

原文链接 作者:Doug Lea 译者:欧振聪 校对:丁一

3 设计与实现

同步器背后的基本思想非常简单。acquire操作如下:

[code lang=”java”]
while (synchronization state does not allow acquire) {
enqueue current thread if not already queued;
possibly block current thread;
}
dequeue current thread if it was queued;
[/code]

release操作如下:

[code lang=”java”]
update synchronization state;
if (state may permit a blocked thread to acquire)
unblock one or more queued threads;
[/code]

为了实现上述操作,需要下面三个基本组件的相互协作:

  • 同步状态的原子性管理;
  • 线程的阻塞与解除阻塞;
  • 队列的管理;

创建一个框架分别实现这三个组件是有可能的。但是,这会让整个框架既难用又没效率。例如:存储在队列节点的信息必须与解除阻塞所需要的信息一致,而暴露出的方法的签名必须依赖于同步状态的特性。

同步器框架的核心决策是为这三个组件选择一个具体实现,同时在使用方式上又有大量选项可用。这里有意地限制了其适用范围,但是提供了足够的效率,使得实际上没有理由在合适的情况下不用这个框架而去重新建造一个。 阅读全文

The j.u.c Synchronizer Framework翻译(一)背景与需求

原文链接 作者:Doug Lea 译者:欧振聪 校对:丁一

摘要

在J2SE 1.5的java.util.concurrent包(下称j.u.c包)中,大部分的同步器(例如锁,屏障等等)都是基于AbstractQueuedSynchronizer(下称AQS类)这个简单的框架来构建的。这个框架为同步状态的原子性管理、线程的阻塞和解除阻塞以及排队提供了一种通用机制。这篇论文主要描述了这个框架基本原理、设计、实现、用法以及性能。

阅读全文

return top