java并发

Reentrancy(重进入)

重进入意味着锁的请求是基于线程(per-thread)而不是调用(invocation)
每个锁关联一个请求计数(acquisition count)和一个占有它的线程

并发容器

同步容器类包括Vector和Hashtable
并发容器改进了同步容器类,提供不会抛出ConcurrentModificationException的迭代器

ConcurrentHashMap

ConcurrentHashMap代替同步的HashMap,是常用的并发容器。
原来用公共锁同步每一个方法,并严格限制只有一个线程能同时访问容器。ConcurrentHashMap使用更加细化的分离锁机制。

  1. 任意数量读程序可以访问
  2. 读写可以并发访问
  3. 有限的写程序可以并发

ConcurrentMap

ConcurrentHashMap不能够在独占访问中被加锁。使用ConcurrentMap接口常见的复合操作:put-if-absent, remove-if-equal, replace-if-equal等都已经实现为原子操作

CopyOnWriteArrayList

同步List的一个并发替代品(CopyOnWriteArraySet是同步Set的一个并发替代品)
访问不需要同步,每次修改都会创建并重新发布一个新的容器拷贝

BlockingQueue

提供可阻塞的put和take方法,与可定时的offer和poll等价
offer方法如果未执行成功会返回一个失败状态,可以根据状态来制定策略

  1. LinkedBlockingQueue和ArrayBlockingQueue是FIFO队列(与LinkedList和ArrayList相似)

  2. PriorityBlockingQueue优先级队列,可以使用Comparable和Comparator处理顺序

  3. SynchronousQueue没有存储能力,除非另一个线程已经准备好参与移交工作,否则put和take会一直阻塞