Java基础之并发相关知识总结

 更新时间:2021年05月26日 14:48:49   作者:vcjmhg  
随着摩尔定律逐步失效,cpu单核性能达到瓶颈,并发逐渐逐渐得到广泛应用,因而学习了解以及使用并发就显得十分重要,但并发相关的知识比较琐碎,不易系统学习,因而本篇文章参照王宝令老师《Java并发编程》来勾勒出一张“并发全景图”,需要的朋友可以参考下

一、Java并发是什么?

用学术定义来说就是

并发:同一时间段,多个任务都在执行 (单位时间内不一定同时执行);

简单来说就是,同一个时间段,让计算机同时做多个事情。

说到并发,不得不提就是并行

并行:单位时间内,多个任务同时执行。

两者大眼一看很像,仔细一想却并不相同,因为并行强调某个时间点多个任务同时执行,而并发强调的是一个时间段内多个任务都在执行

二、怎么做?

大部分并发问题,最终都可以抽象成三类问题分工同步互斥。而且针对不同的问题有着不同的方式来解决,具体如下图所示:

image.png

三、分工

所谓分工,类似于现实中一个组织完成一个项目,项目经理要拆分任务,安排合适的成员去完成。

在并发编程领域,你就是项目经理,线程就是项目组成员。任务分解和分工对于项目成败非常关键,不过在并发领域里,分工更重要,它直接决定了并发程序的性能,并且分工非常重要且复杂,因而Java并发包中有一系列方法来实现分工

  • “Executor与线程池”
  • “ForkJoin”
  • “Future的使用”

基于分工思想设计的并发设计模式也有很多:

  • “Guarded Supension模式”
  • “Balking模式”
  • “Threa-Per-Message模式”
  • “生产者-消费者模式”
  • “Work Thread模式”
  • “两阶段终止模式”

四、同步

同步更多描述的是一种协同关系,在分完工之后,具体执行时,任务之间会有依赖,一个任务之后完成之后,其他依赖它的任务才能开始进行,因而就引入的同步来协同各个任务之间的执行顺序。

针对该类问题,Java也提供了一系列工具来辅助解决:

  • “信号量(Semaphore)机制”
  • “管程(Monitor)”
  • “CountDownLatch”
  • “CyclicBarrier”
  • “Phaser”
  • “Exchanger”

五、互斥

分工、同步主要为了充分发掘CPU的性能来解决问题,但并发问题中,还需要解决正确性问题,即保证线程安全

当多个线程同时访同一个变量时,最后执行的结果是不确定的,比如下边这段代码:

public class UnsafeSequence {
	private int value = 0;
	public int getNext() {
		return ++value;
	}
}

如果我们有多个线程同时调用getNext()时,多个线程之间推进顺序的不同可能会有不同的执行结果:

可能会是2,递推顺序如下:

image.png

可能结果是1,代码执行顺序如下:

image.png

因而结果是不确定的,也就是说结果可能是正确的(比如上边的程序执行结果为2),可能是错误的(比如执行结果是1),执行前是不知道的。而导致不确定的主要源头主要是三个问题可见性问题、有序性问题和原子性问题,为了解决这三个问题,Java引入了内存模型,内存模型提供一系列规则利用这些规则,我们可以避免可见性问题、有序性问题,但是还不足以完全解决线程安全问题。解决线程安全问题的核心方案还是互斥

所谓互斥,指的是同一时刻,只允许一个线程访问共享变量。

实现互斥主要手段是互斥锁主要包含下边这些手段:

  • Synchronized
  • Lock
  • 读写锁

除此之外,未来提高速度,也有一些无锁的方案:

  • 不变模式
  • 线程本地存储
  • CAS
  • Copy - on - Write
  • 原子类

六、总结

本文主要从分工、同步和互斥三类问题展开,从解决对应问题角度出发大致梳理了Java并发知识的学习前景图。后续将分若干部分来讲对应的内容。

到此这篇关于Java基础之并发相关知识总结的文章就介绍到这了,更多相关Java并发内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java基于面向对象实现一个战士小游戏

    Java基于面向对象实现一个战士小游戏

    这篇文章主要为大家详细介绍了Java如何基于面向对象实现一个战士小游戏,文中的示例代码讲解详细,感兴趣的小伙伴可以动手尝试一下
    2022-07-07
  • java多线程之并发工具类CountDownLatch,CyclicBarrier和Semaphore

    java多线程之并发工具类CountDownLatch,CyclicBarrier和Semaphore

    这篇文章主要为大家介绍了java并发工具类CountDownLatch,CyclicBarrier和Semaphore ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12
  • 结合线程池实现apache kafka消费者组的误区及解决方法

    结合线程池实现apache kafka消费者组的误区及解决方法

    这篇文章主要介绍了结合线程池实现apache kafka消费者组的误区及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • java中 ${} 和 #{} 有什么区别

    java中 ${} 和 #{} 有什么区别

    本文主要介绍了java中${}和#{}有什么区别,${}和#{}都是MyBatis中用来替换参数的,它们都可以将用户传递过来的参数,替换到MyBatis最终生成的SQL中,但它们区别却是很大的,感兴趣的小伙伴可以一起来学习下面详细内容
    2022-08-08
  • MyBatis多数据源的两种配置方式

    MyBatis多数据源的两种配置方式

    这篇文章主要给大家介绍了关于MyBatis多数据源的两种配置方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12
  • 在项目中直接使用hystrix的流程分析

    在项目中直接使用hystrix的流程分析

    最近由于一些背景原因,需要在项目中需要对接口进行限流。所以就考虑到了直接使用Hystrix,但是呢,又不想直接使用SpringCloud,而是直接引入原生,现在发现挺好用的,所以记录下来,需要的朋友参考下吧
    2022-06-06
  • Springboot 整合maven插口调用maven release plugin实现一键打包功能

    Springboot 整合maven插口调用maven release plugin实现一键打包功能

    这篇文章主要介绍了Springboot 整合maven插口调用maven release plugin实现一键打包功能,整合maven-invoker使程序去执行mvn命令,结合示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-03-03
  • Spring Boot启动过程完全解析(二)

    Spring Boot启动过程完全解析(二)

    这篇文章主要介绍了Spring Boot启动过程完全解析(二),需要的朋友可以参考下
    2017-04-04
  • Java中String、StringBuffer和StringBuilder的区别

    Java中String、StringBuffer和StringBuilder的区别

    这篇文章主要介绍了Java中String、StringBuffer和StringBuilder的区别,StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串char[]value但是没有final关键字修饰,所以这两个可变,需要的朋友可以参考下
    2024-01-01
  • SpringBoot2新特性 自定义端点详解

    SpringBoot2新特性 自定义端点详解

    这篇文章主要介绍了SpringBoot2新特性 自定义端点详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07

最新评论