`

研磨Java源码--并发框架之锁机制

 
阅读更多

学习Java集合框架需要一些算法基础,而并发框架则需要一些操作系统的基础了。为了学习这部分,博主还专门翻阅了大学操作系统课本,可见基础总是有用啊。

Java并发框架的锁机制是并发框架的重要功能之一。虽然synchronized已经能够完成大多数情况下的互斥操作,但是对于一些希望显式的声明锁并且可以随时中断的地方,仍然会要用到显式锁。synchronized块本质上也是一个对象的内部锁,自从JDK1.6优化以来,synchronized块性能已经跟显式锁相差无几。

本文章所有类均位于java.util.concurrent.locks包中。本文中的Java并发框架主要是指由JDK1.5引进的jsr166,作者Doug Lea(集合框架的作者之一)。

Lock

Lock接口定义了锁的基本行为,lock() tryLock() unlock()等。lockInterruptibly()表示中断时,会释放锁。newCondition()则会返回一个Condition类。

Condition

Monitor(译为管程)和condition variable(条件变量)是操作系统中实现多线程互斥的一种方式,参考维基百科。monitor的核心是wait、singal两条原语。wait等待条件变量就绪,singal则通知条件变量就绪。Java最早的monitor实现是Object对象的wait()和notify()方法。

Condition是monitor的条件变量的另一种方式。这个接口包含await() 和signal()两类方法。它会与Lock配合使用。

ReentrantLock

reentrant的意思是“可重入的”,是指在线程在试图获得它占有的锁时,请求会成功。ReentrantLock通过抽象内部类Sync实现线程等待队列。Sync有两个实现:FairSync(公平队列)和NonfairSync(非公平队列)。FairSync保证严格的FIFO顺序,但是吞吐量会较小。它们都继承了AbstractQueuedSynchronizer框架。AbstractQueuedSynchronizer大量使用了Unsafe的Compare-and-swap原子操作,CAS原语分析具体可参考源码剖析之sun.misc.Unsafe。 AbstractQueuedSynchronizer主要是记录等待链表和锁状态,具体实现比较繁杂,这里不一一分析了。

相比集合框架,并发框架与底层结合更紧密,用到了大量原子操作,代码也比较难读,看了半天源码发现,还是看资料比较好理解。developerWorks上有一个Java并发专题,或者书籍《Java Concurrency in Practice》(Joshua Bloch ( Effective Java 作者)和Doug Lea合著)讲的比较全面。这次先分析这些吧。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics