在《并发容器 part 4 并发队列与Queue简介》节中的类图中可以看到,对于Queue来说,BlockingQueue是主要的线程安全版本。这是一个可阻塞的版本,也就是允许添加/删除元素被阻塞,直到成功为止。BlockingQueue相对于Queue而言增加了两个操作:put/take。下面是一...
分类:
编程语言 时间:
2014-12-02 23:54:50
阅读次数:
296
并发包引入的工具类很多方法都会抛出一定的异常,这些异常描述了任务在线程池中执行时发生的例外情况,而通常这些例外需要应用程序进行捕捉和处理。例如在Future接口中有如下一个API:java.util.concurrent.Future.get(long,TimeUnit)throwsInterrup...
分类:
编程语言 时间:
2014-12-02 23:50:26
阅读次数:
227
这个小节介绍Queue的最后一个工具,也是最强大的一个工具。从名称上就可以看到此工具的特点:双向并发阻塞队列。所谓双向是指可以从队列的头和尾同时操作,并发只是线程安全的实现,阻塞允许在入队出队不满足条件时挂起线程,这里说的队列是指支持FIFO/FILO实现的链表。首先看下LinkedBlocking...
分类:
编程语言 时间:
2014-12-02 23:49:50
阅读次数:
208
本小节介绍锁释放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
去年年底有一个Guice的研究计划,可惜由于工作“繁忙”加上实际工作中没有用上导致“无疾而终”,最终只是完成了Guice的初步学习教程,深入的研究没有继续进行下去。最近一直用的比较多的就是java.util.concurrent(J.U.C),实际上这块一直也没有完全深入研究,这次准备花点时间研究下...
分类:
编程语言 时间:
2014-12-02 22:25:08
阅读次数:
232
从相对简单的Atomic入手(java.util.concurrent是基于Queue的并发包,而Queue,很多情况下使用到了Atomic操作,因此首先从这里开始)。很多情况下我们只是需要一个简单的、高效的、线程安全的递增递减方案。注意,这里有三个条件:简单,意味着程序员尽可能少的操作底层或者实现...
分类:
编程语言 时间:
2014-12-02 22:24:54
阅读次数:
197
formal specification:In computer science, formal specifications are mathematically based techniques whose purpose are to help with the implementation ...
分类:
编程语言 时间:
2014-12-02 22:23:30
阅读次数:
158
在这一部分开始讨论数组原子操作和一些其他的原子操作。AtomicIntegerArray/AtomicLongArray/AtomicReferenceArray的API类似,选择有代表性的AtomicIntegerArray来描述这些问题。int get(int i)获取位置i的当前值。很显然,由...
分类:
编程语言 时间:
2014-12-02 22:20:51
阅读次数:
205