当前位置: 萬仟网 > IT编程>开发语言>Java > 【并发编程】Java对并发编程的支持历史

【并发编程】Java对并发编程的支持历史

2019年11月27日 Java 我要评论
本博客系列是学习并发编程过程中的记录总结。由于文章比较多,写的时间也比较散,所以我整理了个目录贴(传送门),方便查阅。 "并发编程系列博客传送门" 本文转载,原文请点击 "链接" 本章主要对Java并发(Concurrent)在不同jdk版本中的发展简史进行学习。Java语言从第一版本至今,内置了对 ...

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

本文转载,原文请点击

本章主要对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的改进版。
(0)
打赏 微信扫一扫 微信扫一扫

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。

发表评论

验证码:
Copyright © 2017-2022  萬仟网 保留所有权利. 琼ICP备2022007597号