本博客系列是学习并发编程过程中的记录总结。由于文章比较多,写的时间也比较散,所以我整理了个目录贴(传送门),方便查阅。

并发编程系列博客传送门

本文转载,原文请点击链接

本章主要对Java并发(Concurrent)在不同jdk版本中的发展简史进行学习。Java语言从第一版本至今,内置了对并发(Concurrent)的各种支持技术。为了能够让我们在学习Java并发(Concurrent)时,不被各种各样的并发技术弄得晕头转向,本章先对Java个版本中的主要并发技术进行简述。

1. JDK1.4及之前

在JDK1.4及之前的版本,主要提供的并发技术有:

  • synchronized关键字
  • volatile关键字
  • 不变模式

1.1 volatile关键字

引用百度百科的解释:

volatile是一个类型修饰符(type specifier),就像大家更熟悉的const一样,它是被设计用来修饰被不同线程访问和修改的变量。volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。

注:百度百科的解释并不是专门针对java语音中的volatile,而是C语音,不过其设计思想类型,可以拿来借鉴。

更通俗易懂的说法,在Java语音中,使用volatile关键字的目的:

  • 标识这个变量是易变型变量
  • 保证这个变量的可见性
  • 保证一定的有序性

volatile关键字还涉及到JMM(Java内存模型,Java Memory Model)以及并发的三个特性(原子性、有序性和可见性),关于volatile关键字的更多内容,计划在后续章节中进行更加详细的学习。

1.2 synchronized关键字

引用百度百科的一段解释:

synchronized 关键字,代表这个方法(或代码块)加锁,相当于不管哪一个线程(例如线程A),运行到这个方法时,都要检查有没有其它线程B(或者C、 D等)正在用这个方法(或者该类的其他同步方法),有的话要等正在使用synchronized方法的线程B(或者C 、D)运行完这个方法后再运行此线程A,没有的话,锁定调用者,然后直接运行。它包括两种用法:synchronized 方法 和 synchronized 代码块 。

简单来说,synchronized关键字以同步方法和同步代码块的方式,为方法和代码块上的对象加锁。使得同一时刻,在这个对象上的多个线程,只能由持有这个对象锁的单个线程进行代码的调用执行。

synchronized 关键字能够保证代码的原子性、可见性和有序性。

关于synchronized关键字的更多内容,计划在后续章节中进行更加详细的学习。

1.3 不变模式

所谓不变模式,就是指:在并发编程中,为确保数据的一致性和正确性,使用一种不可改变的对象。依靠其不可变的性质,来确保在没有同步的情况下依旧保持一致性和正确性。

Java中不变模式相关技术有:

  • final关键字
  • String类型

关于不变模式,就简单进行这些介绍。如果感兴趣,可以自行学习。

2. JDK5

众所周知,JDK5是Java发展的一个重要版本,提供了很多技术,如泛型 Generic、枚举类型 Enumeration、可变参数varargs、注解 Annotations等等。

在JDK1.5版本中,也提供了对并发编程极为重要的一个包:java.util.concurrent(并发包)

java.util.concurrent(并发包)提供了一些列较为给力的并发技术,主要有:

  • 原子(Atomic)类型:如AtomicInteger、AtomicReference等,保证变量的原子性和可见性。
  • 显式锁(Lock)接口:对之前版本锁机制的重构,相较于synchronized 关键字,能够提供更加灵活的特性,如:能够指定锁定公平性、可以实现分组唤醒(Condition)、性能更好的锁。主要包括:Lock接口、ReadWriteLock接口和Condition接口。
  • 计数器(CountDownLatch):利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行。
  • 回环栅栏(CyclicBarrier):通过它可以实现让一组线程等待至某个状态之后再全部同时执行。叫做回环是因为当所有等待线程都被释放以后,CyclicBarrier可以被重用。
  • 信号量(Semaphore):Semaphore可以控同时访问的线程个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。
  • 并发集合:即集合类在并发环境下的版本。主要有:BlockingQueue(Queue)、ConcurrentMap(Map)、ConcurrentHashMap(HashMap)、CopyOnWriteArrayList(ArrayList)。
  • Callable和Future接口:为了解决继承Thread类和实现Runnable接口存在的弊端(不允许声明检查型异常,不能定义返回值),而引入的线程的新的定义方式。
  • 执行器(Executor接口):Executors相关类隐藏了如何处理Runnable的细节,提供了一组方法,能够创建拥有完善配置的线程池和executor。

关于原子(Atomic)类型、显式锁(Lock)接口、并发集合、Callable和Future接口、执行器(Executor接口)的更多内容,计划在后续章节中进行更加详细的学习。

3. JDK7

在JDK1.7版本中,主要提供的并发编程技术有:

  • TransferQueue:比BlockingQueue性能更好的并发集合实现。
  • 分支合并(Fork/Join)框架:运用分治法(divide-and-conquer)的思想,实现线程池中任务的自动调度,并且这种调度对用户来说是透明的,典型应用ForkJoinPool。

关于分支合并(Fork/Join)框架的更多内容,计划在后续章节中进行更加详细的学习。

4.JDK8

在JDK.18版本中,主要提供的并发编程技术有:

  • 加法器(Adder)和累加器(Accumulator):原子类型的扩充与优化,主要有:LongAdder、LongAccumulator、DoubleAdder和DoubleAccumulator,比AtomicLong和AtomicDouble性能更优。
  • CompletableFuture:JDK5中Future的增强版。
  • StampedLock:JDK5中ReadWriteLock的改进版。

【并发编程】Java对并发编程的支持历史的更多相关文章

  1. java高并发系列 - 第10天:线程安全和synchronized关键字

    这是并发系列第10篇文章. 什么是线程安全? 当多个线程去访问同一个类(对象或方法)的时候,该类都能表现出正常的行为(与自己预想的结果一致),那我们就可以所这个类是线程安全的. 看一段代码: pack ...

  2. java高并发系列 - 第6天:线程的基本操作

    新建线程 新建线程很简单.只需要使用new关键字创建一个线程对象,然后调用它的start()启动线程即可. Thread thread1 = new Thread1(); t1.start(); 那么 ...

  3. java高并发系列 - 第14天:JUC中的LockSupport工具类,必备技能

    这是java高并发系列第14篇文章. 本文主要内容: 讲解3种让线程等待和唤醒的方法,每种方法配合具体的示例 介绍LockSupport主要用法 对比3种方式,了解他们之间的区别 LockSuppor ...

  4. 跟着阿里p7一起学java高并发 - 第19天:JUC中的Executor框架详解1,全面掌握java并发核心技术

    这是java高并发系列第19篇文章. 本文主要内容 介绍Executor框架相关内容 介绍Executor 介绍ExecutorService 介绍线程池ThreadPoolExecutor及案例 介 ...

  5. java高并发系列 - 第21天:java中的CAS操作,java并发的基石

    这是java高并发系列第21篇文章. 本文主要内容 从网站计数器实现中一步步引出CAS操作 介绍java中的CAS及CAS可能存在的问题 悲观锁和乐观锁的一些介绍及数据库乐观锁的一个常见示例 使用ja ...

  6. java高并发系列 - 第20天:JUC中的Executor框架详解2之ExecutorCompletionService

    这是java高并发系列第20篇文章. 本文内容 ExecutorCompletionService出现的背景 介绍CompletionService接口及常用的方法 介绍ExecutorComplet ...

  7. java高并发系列 - 第13天:JUC中的Condition对象

    本文目标: synchronized中实现线程等待和唤醒 Condition简介及常用方法介绍及相关示例 使用Condition实现生产者消费者 使用Condition实现同步阻塞队列 Object对 ...

  8. java高并发系列-第1天:必须知道的几个概念

    java高并发系列-第1天:必须知道的几个概念 同步(Synchronous)和异步(Asynchronous) 同步和异步通常来形容一次方法调用,同步方法调用一旦开始,调用者必须等到方法调用返回后, ...

  9. java高并发系列 - 第12天JUC:ReentrantLock重入锁

    java高并发系列 - 第12天JUC:ReentrantLock重入锁 本篇文章开始将juc中常用的一些类,估计会有十来篇. synchronized的局限性 synchronized是java内置 ...

  10. java高并发系列 - 第15天:JUC中的Semaphore,最简单的限流工具类,必备技能

    这是java高并发系列第15篇文章 Semaphore(信号量)为多线程协作提供了更为强大的控制方法,前面的文章中我们学了synchronized和重入锁ReentrantLock,这2种锁一次都只能 ...

随机推荐

  1. C# 添加、修改、删除Excel图表数据标签

    图表中,图表数据标签以数据化形式表现图表中的特定数据,可增强图表的可读性.我们可以对图表添加数据标签,也可以对已有的数据标签进行修改或者删除,下面将通过C#代码形式来实现. 使用工具:Spire.XL ...

  2. C加加学习之路 2——两招让你成为牛X的T型人才

    有个小伙伴在微信上问我: 我刚工作半年,有时候对于Java的发展方向有点迷茫,Java的范围是在是太广了,我有时候会不知道从哪开始入手,我想问一下,您有什么好的建议吗? 我理解这位朋友的问题是:工作中 ...

  3. NetworkManager网络通讯_NetworkLobbyManager(三)

    此部分可以先建立游戏大厅,然后进入游戏,此处坑甚多耗费大量时间.国内百度出来的基本没靠谱的,一些专栏作家大V也不过是基本翻译了一下用户手册(坑啊),只能通过看youtube视频以及不停的翻阅用户手册解 ...

  4. QlikSense 2018.2月版起支持主题开发

    自定义主题开发 // 主题是qliksense 2018年2月版提出,4月版正式实施,其实就是去修改sense默认的.json文件和.css文件 { // 定义自定义主题是否从默认主题(Sense C ...

  5. 设计模式C++描述----07.建造者(Builder)模式

    一. 概述 Builder 模式要解决的问题是:当我们要创建的对象很复杂的时候(通常是由很多其他的对象组合而成),我们要要复杂对象的创建过程和这个对象的表示(展示)分离开 来,这样做的好处就是通过一步 ...

  6. spring cloud 2.x版本 Eureka Server服务注册中心教程

    本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 1.创建服务注册中心 1.1 新建Spring boot工程:eureka-server 1 ...

  7. java里的单例实现

    枚举实现单例 线程安全,调用效率高,不能延时加载,可以天然的防止反射和反序列化调用 public enum SingletonFactory { //枚举元素本身就是单例 INSTANCE; //添加 ...

  8. spring boot 面试题详解

    1.什么是springboot 用来简化spring应用的初始搭建以及开发过程 使用特定的方式来进行配置(properties或yml文件) 创建独立的spring引用程序 main方法运行 嵌入的T ...

  9. TICK技术栈(二)Telegraf安装及使用

    1.什么是Telegraf? Telegraf是一个用Go语言开发的代理程序,可用于收集和报告指标.Telegraf插件直接从其运行的系统中获取各种指标,从第三方API中提取指标,甚至通过StatsD ...

  10. 安装Java环境

    一.下载JDK https://www.oracle.com/technetwork/java/javase/downloads/index.html 二.exe安装 默认路径 C:\Program ...