《Java Concurrency》读书笔记,使用JDK并发包构建程序
1. java.util.concurrent概述
JDK5.0以后的版本都引入了高级并发特性,大多数的特性在java.util.concurrent包中,是专门用于多线并发编程的,充分利用了现代多处理器和多核心系统的功能以编写大规模并发应用程序。主要包含原子量、并发集合、同步器、可重入锁,并对线程池的构造提供了强力的支持。
原子量,是定义了支持对单一变量执行原子操作的类。所有类都有get和set方法,工作方法和对volatile变量的读取和写入一样。
并发集合,是原有集合框架的补充,为多线程并发程序提供了支持。主要有:BlockingQueue,ConcurrentMap,ConcurrentNavigableMap。
同步器,提供了一些帮助在线程间协调的类,包括semaphores,barriers,latches, exchangers等。
Lock对象,一般同步代码依靠内部锁(隐式锁),这种锁易于使用,但是有很多局限性。新的Lock对象支持更加复杂的锁定语法。和隐式锁类似,每一时刻只有一个线程能够拥有Lock对象,通过与其相关联的Condition对象,Lock对象也支持wait和notify机制。
线程池,略
2. 原子量
无锁算法(nonblocking algorithms),使用低层原子化的机器指令,例如使用compare-and-swap(CAS)代替锁保证并发情况下数据的完整性。无锁算法广泛应用于操作系统与JVM中,比如线程和进程的调度、垃圾收集、实现锁和其他并发数据结构。
2.1 原子变量类
java.util.concurrent.atomic 包中提供了原子变量的几种实现,AtomicBoolean、AtomicInteger、AtomicLong、AtomicReference<V>等等。
开发人员可以直接将原子变量用作共享计数器、序号生成器和其他独立共享变量的高性能替代,否则必须通过同步保护这些变量。
参考:Java:多线程,java.util.concurrent.atomic包之AtomicInteger/AtomicLong用法
3. 并发集合
3.1 Queue接口与BlockingQueue接口
java.util 包为集合提供了一个新的基本接口:java.util.Queue。具体内容可以参考:Java:集合,Collection接口框架图
java.util.concurrent包为集合提供了一个线程安全的接口:java.util.concurrent.BlockingQueue。具体内容可以参考:Java:集合,concurrent包下面的Collection接口框架图
继承于Queue接口的ConcurrentLinkedQueue类,以及实现BlockingQueue接口的五个队列类:ArrayBlockingQueue、LinkedBlockingQueue 、PriorityBlockingQueue、DelayQueue、SynchronousQueue的具体内容,请参考:Java:集合,concurrent包下面的Collection接口框架图
3.2 使用 ConcurrentMap 实现类
ConcurrentMap接口中定义的方法是原子性的。ConcurrentHashMap为其实现类。具体内容参考:Java:集合,concurrent包下面的Map接口框架图
3.3 CopyOnWriteArrayList 和 CopyOnWriteArraySet
参考:Java:集合,concurrent包下面的Collection接口框架图