《Java并发编程实战》 同步工具类的设计

创建状态依赖类最简单的方法通常是在类库中现有状态依赖类的基础上进行构造,如果类库不支持,则可以使用Java语言和类库提供的底层机制来构造自己的同步机制,包括内置的条件队列、显示的Condition对象以及AbstractQueuedSynchronizer框架。

在单线程的程序中调用方法时,如果基于某个状态的前提条件未得到满足,那么这个条件永远无法成真。而在并发程序中,基于状态的条件可能会由于其他线程的操作而改变。

《Java并发编程实战》 显式锁的使用

在java 5.0之前,协调共享对象的访问可以使用的机制有synchronizedvolatile,java 5.0中新增了一种新的机制:ReentrantLock。它的作用并不是用来替代内置锁,而是当内置锁不再适用时,作为一种可选择的高级功能。在java 6.0中,也使用了与ReentrantLock类似的算法对内置锁本身进行了改进,有效地提高了内置锁的可伸缩性。

《Java并发编程实战》 任务的取消

如果外部代码能在某个操作正常完成之前将其置入完成状态,那么这个操作就可以称为可取消的,行为良好的软件都应该能很完善地处理失败、关闭和取消等过程。 一个可取消的任务必须拥有取消策略,在这个策略中定义:

  • 其他代码如何请求取消该任务;
  • 任务在何时检查是否已经请求了取消;
  • 在响应取消请求时应该执行哪些操作;

Java中并没有提供任何机制来安全地终止线程,但它提供了一种协作机制,即通过设置某个已请求取消的标志,然后任务执行过程中定期地查看该标志,如果设置了,那么任务提前结束

《Java并发编程实战》 任务的执行

任务通常是一些抽象且离散的工作单元,通过把程序中的工作分解到多个任务中,可以简化程序的组织结构,提供一种自然的事务边界来优化错误恢复过程,并提供一种自然的并行工作结构来提升并发性。

在正常的负载下,服务器应用程序应该同时表现出良好的吞吐量快速的响应性 。程序提供商希望程序支持尽可能多的用户,从而降低每个用户的服务成本,而用户则希望获得尽快的响应。当负荷过载时,程序的性能应该是逐渐降低,而不是直接失败。

理想情况下,可以找出清晰的任务边界,各个任务之间是相互独立的,即任务不依赖于其他任务的状态、结果或边界效应。独立性有助于并发,因为如果存在足够多的处理资源,那么这些独立的任务就可以并行执行,这也为调度与负载均衡等的实现提供了更好的灵活性。