转载

java.util.concurrent.locks

java.util.concurrent.locks

@(Base)[JDK, locks, ReentrantLock, AbstractQueuedSynchronizer, AQS]

Synchronize最开始JDK只支持 synchronize 关键字来提供方法级别、同步块级别的同步。后续版本中提供了 java.utils.concurrent.locks 包,其中包括可重入锁,读写锁,信号量,Condition等等,都是基于一个基本的等待队列抽象完成的,在JDK的文档中,这个抽象的队列框架被称为 AQS 同步框架。

我们需要关注的类包括: AbstractOwnableSynchronizer , AbstractQueuedSynchronizer 其余的包括,可重入锁,读写锁,Condition,信号量都是通过上述两个抽象基类实现。

整个concurrent包源自于JSR-166,其作者就是大名鼎鼎的 Doug Lea ,说他是这个世界上对Java影响力最大的个人,一点也不为过。因为两次Java历史上的大变革,他都间接或直接的扮演了举足轻重的角色。一次是由JDK 1.1到JDK 1.2,JDK1.2很重要的一项新创举就是Collections,其Collections的概念可以说承袭自Doug Lea于1995年发布的第一个被广泛应用的collections;一次是2004年所推出的Tiger。Tiger广纳了15项JSRs(Java Specification Requests)的语法及标准,其中一项便是JSR-166。

AbstractOwnableSynchronizer

可独占的同步器

A synchronizer that may be exclusively owned by a thread. This class provides a basis for creating locks and related synchronizers that may entail a notion of ownership. The AbstractOwnableSynchronizer class itself does not manage or use this information. However, subclasses and tools may use appropriately maintained values to help control and monitor access and provide diagnostics.

这个类作用就是提供了一种“独占”模式的基本实现,其代码非常简单:

public abstract class AbstractOwnableSynchronizer {     /** The current owner of exclusive mode synchronization. */     private transient Thread exclusiveOwnerThread;     protected final void setExclusiveOwnerThread(Thread t) {         exclusiveOwnerThread = t;     }     protected final Thread getExclusiveOwnerThread() {         return exclusiveOwnerThread;     } } 

通过一个私有域来保存当前占用这个“同步器”的线程(可认为是一个标志位),并且提供了get,set方法来改变这个独占的标志位。这里并没有使用任何同步的手段,因为只是个基类啦。

transient 关键字是对java的serialization机制起作用的,意义是不要序列化这个字段。这里我们可以忽略,因为我也暂时想不到任何场景需要serialize一个同步器的场景。

原文  http://www.cnblogs.com/maxmys/p/5181254.html
正文到此结束
Loading...