J.U.C并发包简介
J.U.C并发包, 即java.util.concurrent包, 是JDK的核心工具包, 是JDK1.5之后, 由 Doug Lea实现 并引入.
整个J.U.C包按照功能可划分如下:
- J.U.C_locks: 锁框架
- J.U.C_atomic: 原子类框架
- J.U.C_sync: 同步器框架
- J.U.C_collections: 集合框架
- J.U.C_executors: 执行器框架
J.U.C_locks 锁框架
早期的JDK版本中, 仅仅提供了synchronizd、wait、notify等等比较底层的多线程同步工具, 开发人员如果需要开发复杂的多线程应用, 通常需要基于JDK提供的这些基础工具进行封装, 开发自己的工具类. JDK1.5+后, Doug Lea根据一系列常见的多线程设计模式, 设计了JUC并发包, 其中java.util.concurrent.locks包下提供了一系列基础的锁工具, 用以对synchronizd、wait、notify等进行补充、增强.
- 接口
- Lock
- Condition
- ReadWriteLock
- 实现类
- ReentrantLock
- ReentrantReadWriteLock
- StampedLock
- 辅助类
- LockSupport
- AbstractOwnableSynchronizer
- AbstractQueuedLongSynchronizer
- AbstractQueuedSynchronizer
本部分相关文章:
J.U.C_atomic 原子类框架
早期的JDK版本中, 如果要并发的对Integer、Long、Double之类的Java原始类型或引用类型进行操作, 一般都需要通过锁来控制并发, 以防数据不一致.
从JDK1.5开始, 引入了java.util.concurrent.atomic工具包, 该包提供了许多Java原始/引用类型的映射类, 如AtomicInteger、AtomicLong、AtomicBoolean, 这些类可以通过一种“无锁算法”, 线程安全的操作Integer、Long、Boolean等原始类型.
所谓“无锁算法”, 其实底层就是通过Unsafe类实现的一种比较并交换的算法, 大致的结构如下: boolean compareAndSet(expectedValue, updateValue); 当希望修改的值与expectedValue相同时, 则尝试将值更新为updateValue, 更新成功返回true, 否则返回false.
- 更新基本类型
- AtomicBoolean
- AtomicInteger
- AtomicLong
- 更新数组类型
- AtomicIntegerArray
- AtomicLongArray
- AtomicReferenceArray
- 更新引用类型
- AtomicReference
- AtomicMarkableReference
- AtomicStampedReference
- 更新字段
- AtomicIntegerFieldUpdater
- AtomicLongFieldUpdater
- AtomicReferenceFieldUpdater
- 其他
- Striped64
- DoubleAccumulator
- DoubleAdder
- LongAccumulator
- LongAdder
- Striped64
本部分相关文章:
J.U.C_sync 同步器框架
这里的J.U.C_sync同步器框架, 是指java.util.concurrent包下一些辅助同步器类, 每个类都有自己适合的使用场景:
- CountDownLatch: 倒数计数器, 构造时设定计数值, 当计数值归零后, 所有阻塞线程恢复执行. 内部实现了AQS框架.
- CyclicBarrier: 循环栅栏, 构造时设定等待线程数, 当所有线程都到达栅栏后, 栅栏放行. 其内部通过ReentrantLock和Condition实现同步.
- Semaphore: 信号量, 类似于令牌, 用于控制共享资源的访问数量. 其内部实现了AQS框架.
- Exchanger: 交换器, 类似于双向栅栏, 用于线程之间的配对和数据交换. 其内部根据并发情况有“单槽交换”和“多槽交换”之分.
- Phaser: 多阶段栅栏, 相当于CyclicBarrier的升级版, 可用于分阶段任务的并发控制执行. 其内部比较复杂, 支持树形结构, 以减少并发带来的竞争.
本部分相关文章:
J.U.C_collections 集合框架
这里的J.U.C_collections集合框架, 是指java.util.concurrent包下的一些同步集合类, 按类型划分可以分为: 符号表、队列、Set集合、列表 四大类, 每个类都有自己适合的使用场景.
- 符号表
- ConcurrentMap: 接口
- ConcurrentNavigableMap
- ConcurrentSkipListMap
- ConcurrentHashMap
- ConcurrentNavigableMap
- ConcurrentMap: 接口
- 队列
- BlockingQueue
- TransferQueue
- LinkedTransferQueue
- BlockingDeque
- LinkedBlockingDeque
- LinkedBlockingQueue
- ArrayBlockingQueue
- PriorityBlockingQueue
- DelayQueue
- TransferQueue
- ConcurrentLinkedQueue
- ConcurrentLinkedDueue
- BlockingQueue
- Set集合
- CopyOnWriteArraySet
- ConcurrentSkipListSet
- 列表
- CopyOnWriteArrayList
本部分相关文章:
J.U.C_executors 执行器框架
executors框架是整个J.U.C包中类/接口关系最复杂的框架, executors其实可以划分为3大块, 每一块的核心都是基于Executor这个接口.
- 线程池
- Future模式
- Fork/Join框架
本部分相关文章:
- Java线程池基本架构
本文借鉴自segmentfault并发专栏