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

作者:vcjmhg 时间:2022-04-24 13:59:05 

一、Java并发是什么?

用学术定义来说就是

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

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

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

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

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

二、怎么做?

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

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

三、分工

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

在并发编程领域,你就是项目经理,线程就是项目组成员。任务分解和分工对于项目成败非常关键,不过在并发领域里,分工更重要,它直接决定了并发程序的性能,并且分工非常重要且复杂,因而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,递推顺序如下:

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

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

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

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

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

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

  • Synchronized

  • Lock

  • 读写锁

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

  • 不变模式

  • 线程本地存储

  • CAS

  • Copy - on - Write

  • 原子类

六、总结

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

来源:https://blog.csdn.net/Startapi/article/details/117229742

标签:Java,并发
0
投稿

猜你喜欢

  • SpringBoot整合Swagger2的步骤详解

    2021-07-19 11:59:49
  • Java 开启多线程常见的4种方法

    2023-11-23 02:30:10
  • RocketMQ集群消费与广播消费模式

    2021-10-16 07:20:45
  • Java实现将PDF转为PDF/A

    2023-03-16 00:54:22
  • IDEA JetBrains Mono字体介绍和安装教程(详解)

    2022-01-23 17:57:51
  • Android 将文件下载到指定目录的实现代码

    2021-06-11 04:44:41
  • 解析spring事务管理@Transactional为什么要添加rollbackFor=Exception.class

    2021-09-03 17:07:41
  • SpringBoot工程搭建打包、启动jar包和war包的教程图文详解

    2022-05-04 22:09:10
  • java中生产者消费者问题和代码案例

    2023-11-24 04:09:07
  • java实现列表、集合与数组之间转化的方法

    2023-11-29 10:17:38
  • Android定时器和倒计时实现淘宝秒杀功能

    2023-01-18 02:17:04
  • Java中初始化List集合的八种方式汇总

    2021-09-20 22:31:54
  • C#实现的字符串相似度对比类

    2023-08-08 20:35:10
  • Java泛型机制必要性及原理解析

    2022-09-30 02:21:41
  • 关于Mybatis与JPA的优缺点说明

    2023-08-23 22:28:33
  • Android编程中沉浸式状态栏的三种实现方式详解

    2022-02-10 11:56:23
  • java10下编译lombok注解代码分享

    2023-06-06 11:02:35
  • 超简洁java实现双色球若干注随机号码生成(实例代码)

    2023-12-03 22:39:08
  • Mybatis基础概念与高级应用小结

    2023-11-26 20:18:22
  • SpringMVC之AbstractAnnotationConfigDispatcherSer解读

    2023-06-21 21:42:32
  • asp之家 软件编程 m.aspxhome.com