并发编程8:多线程基础-JDK中的线程演化路线
Posted 依码平川
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并发编程8:多线程基础-JDK中的线程演化路线相关的知识,希望对你有一定的参考价值。
概述
关于并发编程,前面几篇内容主要从JVM原理层面介绍了“内存模型与线程”,“线程安全与锁优化”的相关内容,有了上面的理论基础,再学习java中的多线程编程就相对容易些。
古人云 “读万卷书,不如行万里路”,今人也说“理论联系实践”,然而,在日常工作及面试过程中发现,有些同事虽然对原理性的知识有一定的了解,但落实到具体代码时,却又经常搞不清楚,针对此问题,在接下再来的章节中,我将重点从实践的角度出发,看如何驾驭多线程这匹野马。
本文作为多线程基础内容的开篇,从JDK中的线程演化路线开始说起,因现在生产上大部分系统都运行在JDK8及以下版本,故本文梳理的特性范围限定在从JDK1到JDK8,主要是概览,了解下JDK中各版本都做了些什么,为后续细化处理做好铺垫。
JDK中多线程处理的演进
JDK1.0--JDK1.4
线程处理方式
Thread(JDK1.0)
Runnable(JDK1.0)
synchronized
volatile
实现局限性
无返回值
无异常处理
执行结果获取困难
缺少线程管理的原生支持
缺少api层面的锁处理(只能依赖synchronized)
DCL(Double Check Locking 双重检查锁)具有不确定性
JDK1.5 _juc(重中之重)
atomic(java中的13个原子操作类)
原子更新基本类型类
AtomicBoolean
AtomicInteger
AtomicLong
原子更新数组
AtomicIntegerArray
AtomicLongArray
AtomicReferenceArray
原子更新引用类型
AtomicReference
AtomicIntegerFieldUpdater
AtomicMarkableReference
原子更新字段类
AtomicIntegerFieldUpdater
AtomicLongFieldUpdater
AtomicStampedReference
AtomicReferenceFieldUpdater
locks
Lock
AbstractQueuedSynchronizer(AQS)
ReentrantLock,Condition
ReadWriteLock,ReentrantReadWriteLock
Executor(线程池)
Executor,ExecutorService,AbstractExecutorService
ScheduledExecutorService
ThreadPoolExecutor,ScheduledThreadPoolExecutor
Executors(线程池工具)
Future,FutureTask,CallBack
并发容器
BlockingQueue系列:
ArrayBlockingQueue
LinkedBlockingQueue
SynchronousQueue
Concurrent系列:
ConcurrentMap
ConcurrentHashMap
ConcurrentLinkedQueue
CopyOnWrite系列:
CopyOnWriteArrayList
CopyOnWriteArraySet
并发框架
CountDownLatch
CyclicBarrier
Semaphore
Exchanger
JDK1.6_锁优化
主要优化点
自旋与自适应自旋
锁粗化与锁消除
偏向锁,轻量级锁,重量级锁
锁优化
juc 扩展内容
BlockingDeque
ConcurrentSkipListMap
ConcurrentSkipListSet
AbstractOwnableSynchronizer
AbstractQueuedLongSynchronizer
LockSupport
locks
并发容器
其他
JDK1.7_fork-join
扩展内容
Fork/Join
ConcurrentLinkedDeque
juc
编程模型
ForkJoinPool
ForkJoinTask
RecursiveAction
Future的限制
无法手动完成
阻塞时结果返回
无法链式多个Future
无法合并多个Future结果
缺少异常处理
JDK1.8_completableFuture
扩展内容
StampedLock
DoubleAccumulator
DoubleAdder
LongAccumulator
LongAdder
juc.atomic
juc.locks
引入CompletableFuture
编程模型
CompletionStage
CompletableFuture
StampedLock
总结
本文主要从JDK演化的角度梳理了各版本与并发编程相关的内容,从中可以发现JDK1.5这个版本非常重要,具有跨世纪颠覆性的意义,从源码的注释中可以看出,关于JAVA并发编程,代码基本上都是由“Doug Lea”大神完成,此人对于JAVA的贡献度不亚于JAVA之父——Gosling (詹姆斯·高斯林 ),有兴趣的可以上网了解下他。
对于本章罗列出来的一堆类,您是似曾相识,还是素未蒙面呢?接下来的章节准备细细道来,这注定是一场艰难的跋涉,背好行囊,准备出发吧……
以上是关于并发编程8:多线程基础-JDK中的线程演化路线的主要内容,如果未能解决你的问题,请参考以下文章