如果说CountDownLatch是一次性的,那么CyclicBarrier正好可以循环使用。它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。所谓屏障点就是一组任务执行完毕的时刻。清单1 一个使用CyclicBarrier的例子package xylz....
分类:
编程语言 时间:
2014-12-03 00:00:16
阅读次数:
316
从这一节开始介绍锁里面的最后一个工具:读写锁(ReadWriteLock)。ReentrantLock 实现了标准的互斥操作,也就是一次只能有一个线程持有锁,也即所谓独占锁的概念。前面的章节中一直在强调这个特点。显然这个特点在一定程度上面减低了吞吐量,实际上独占锁是一种保守的锁策略,在这种情况下任何...
分类:
编程语言 时间:
2014-12-02 23:59:35
阅读次数:
527
这一节主要是谈谈读写锁的实现。上一节中提到,ReadWriteLock看起来有两个锁:readLock/writeLock。如果真的是两个锁的话,它们之间又是如何相互影响的呢?事实上在ReentrantReadWriteLock里锁的实现是靠java.util.concurrent.locks.Re...
分类:
编程语言 时间:
2014-12-02 23:55:44
阅读次数:
297
此小节介绍几个与锁有关的有用工具。闭锁(Latch)闭锁(Latch):一种同步方法,可以延迟线程的进度直到线程到达某个终点状态。通俗的讲就是,一个闭锁相当于一扇大门,在大门打开之前所有线程都被阻断,一旦大门打开所有线程都将通过,但是一旦大门打开,所有线程都通过了,那么这个闭锁的状态就失效了,门的状...
分类:
编程语言 时间:
2014-12-02 23:55:44
阅读次数:
243
本小节介绍锁释放Lock.unlock()。Release/TryReleaseunlock操作实际上就调用了AQS的release操作,释放持有的锁。public final boolean release(int arg) { if (tryRelease(arg)) { Node h = he...
分类:
编程语言 时间:
2014-12-02 23:49:30
阅读次数:
201
在这个小结里面重点讨论原子操作的原理和设计思想。由于在下一个章节中会谈到锁机制,因此此小节中会适当引入锁的概念。在Java Concurrency in Practice中是这样定义线程安全的:当多个线程访问一个类时,如果不用考虑这些线程在运行时环境下的调度和交替运行,并且不需要额外的同步及在调用方...
分类:
移动开发 时间:
2014-12-02 22:28:48
阅读次数:
259
前面的章节主要谈谈原子操作,至于与原子操作一些相关的问题或者说陷阱就放到最后的总结篇来整体说明。从这一章开始花少量的篇幅谈谈锁机制。上一个章节中谈到了锁机制,并且针对于原子操作谈了一些相关的概念和设计思想。接下来的文章中,尽可能的深入研究锁机制,并且理解里面的原理和实际应用场合。尽管synchron...
分类:
编程语言 时间:
2014-12-02 22:25:59
阅读次数:
203
在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁(后面的章节还会谈到锁)。锁机制存在以下问题:(1)在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题。(2)一个线程持有锁会导致其它所有需要此锁的线程挂起。(3)如果一个优先级高的线程等...
分类:
编程语言 时间:
2014-12-02 22:08:37
阅读次数:
227
在理解J.U.C原理以及锁机制之前,我们来介绍J.U.C框架最核心也是最复杂的一个基础类:java.util.concurrent.locks.AbstractQueuedSynchronizer。AQSAbstractQueuedSynchronizer,简称AQS,是J.U.C最复杂的一个类,导...
分类:
编程语言 时间:
2014-12-02 22:08:30
阅读次数:
255
http://blog.csdn.net/chen77716/article/details/6641477前文(深入JVM锁机制-synchronized)分析了JVM中的synchronized实现,本文继续分析JVM中的另一种锁Lock的实现。与synchronized不同的是,Lock完全用...
分类:
其他好文 时间:
2014-11-30 15:28:03
阅读次数:
259