并发编程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中的线程演化路线的主要内容,如果未能解决你的问题,请参考以下文章

互联网架构多线程并发编程高级教程(下)

并发编程路线

史上最全的并发编程学习目录

并发编程之多线程

Java并发编程系列之二线程基础

Java并发编程基础(入门篇)