0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

详析Java线程进程的并发问题

如意 来源:IT技术百货 作者:IT技术百货 2020-07-07 11:44 次阅读

并发的前提条件

并发问题发生的前提条件一定是资源共享,这里的资源一般指的是数据,共享指的是多线程之间共享。

也就是只有在多线程共享资源的情况下才可能产生并发问题,这是并发问题产生的前提条件,在这个条件下,有可能产生并发问题,那么并发问题的根源究竟是什么呢?

CPU操作数据的基本机制

前面提到了并发的前提条件是数据共享,想了解并发问题的根源就需要知道CPU操作数据的基本原理;

数据存储包括这几个位置:磁盘、内存、缓存、寄存器

寄存器可以认为是CPU的一部分,所以有的地方并没有将CPU和寄存器拆分讲解,通常来讲只需要知道CPU运算时都是从寄存器取数据,运算完成后再放回寄存器即可,CPU和寄存器之间没有其他任何中介。

缓存是CPU与寄存器之外的一层存储,但也是每一个CPU独立占有的一块内存区域,各个CPU缓存之间数据不可以共享。

内存是程序运行时数据的主要存放区域,内存数据是共享的,一般来讲,各个CPU都可以访问内存中的数据;

磁盘,数据最终持久化的存储;

CPU操作数据的流程一般是先由磁盘读到内存,再从内存读到缓存,再由缓存到寄存器进行运算;运算之后的结果直接写入寄存器,然后刷新到缓存,再刷新到内存,最后写入磁盘;

程序数据流图

并发问题的源头

了解了CPU运行机制之后,下面说并发问题的根源,主要是由于数据可见性、操作原子性、操作有序性这三个原因导致的;

什么是数据可见性?

通俗点来说就是CPU看到的数据并不是最新的数据,CPU读取数据是优先从缓存中读取,如果缓存中存在就使用缓存中的数据,假如数据被另一个CPU改变了,这时其他CPU中缓存数据就可能与内存中的数据不一致,也就是CPU没有看到并使用最新的数据,导致程序执行结果异常。

什么是操作原子性?

同一个CPU可以交替执行多个线程,不太了解的读者可以初步学习一下CPU时间片与线程调度的基本知识。

在同一个CPU,交替执行多个线程的时候,就可能出现线程中断,并且在中断过程中受其他线程影响而导致中断的线程恢复之后,执行逻辑异常。

比如:a线程执行count = count + 1操作,b线程也执行相同的操作;当a线程读取到count的值,并进行加1计算之后,还没写回到内存之前被中断,b线程完全执行了count = count + 1,count的值得到更新;这时a线程恢复(并不会重新读取并计算),将之前计算的值写回到缓存,导致count本来应该执行两次加1,但最终结果只加了一次1;

什么是操作有序性?

有序性指的是CPU执行代码的顺序和程序开发者定义的顺序不一致?为什么还会不一致呢?

编译器在将高级开发语言编译成计算机指令的时候,出于性能优化,可能会对代码执行重排序,CPU在执行指令的时候,也可能对代码重排序;当然重排序的前提是在单线程条件下的语义不变性,但不能保证多线程条件下语义也相同。

Java单例模式中的双重校验锁,单例变量为什么要声明为volatile,就是为了解决指令重排序带来的问题,我们在下一章节进行详细讲解。感兴趣的也可以自行查阅资料学习。

并发问题的解决方案

并发问题不是Java语言特有的,而是计算机运行原理与操作系统带来的,那么从计算机与操作系统层面来看,它们都提供了哪些解决方案来避免数据可见性、程序原子性、操作有序性的保障呢?Java语言又是如何对这些方案进行封装的呢?开发者有哪些手段可以解决这些问题呢?

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    19

    文章

    2957

    浏览量

    104544
  • 线程
    +关注

    关注

    0

    文章

    504

    浏览量

    19649
  • 进程
    +关注

    关注

    0

    文章

    201

    浏览量

    13947
收藏 人收藏

    评论

    相关推荐

    socket 多线程编程实现方法

    是指在同一个进程中运行多个线程,每个线程可以独立执行任务。线程共享进程的资源,如内存空间和文件句柄,但每个
    的头像 发表于 11-12 14:16 223次阅读

    一文搞懂Linux进程的睡眠和唤醒

    机制 1)信号(Signal): 进程可以通过接受特定信号被唤醒。 2)条件变量(Condition Variable): 多线程编程中用于同步多个线程的工具,可以让一个线程在某些
    发表于 11-04 15:15

    Python中多线程和多进程的区别

    Python作为一种高级编程语言,提供了多种并发编程的方式,其中多线程与多进程是最常见的两种方式之一。在本文中,我们将探讨Python中多线程与多
    的头像 发表于 10-23 11:48 313次阅读
    Python中多<b class='flag-5'>线程</b>和多<b class='flag-5'>进程</b>的区别

    探索虚拟线程:原理与实现

    虚拟线程的引入与优势 在Loom项目之前,Java虚拟机(JVM)中的线程是通过java.lang.Thread类型来实现的,这些线程被称为
    的头像 发表于 06-24 11:35 260次阅读
    探索虚拟<b class='flag-5'>线程</b>:原理与实现

    一句话让你理解线程进程

    今天给大家分享一下线程进程,主要包含以下几部分内容:一句话说明线程进程操作系统为什么需要进程为什么要引入
    的头像 发表于 06-04 08:04 1075次阅读
    一句话让你理解<b class='flag-5'>线程</b>和<b class='flag-5'>进程</b>

    鸿蒙原生应用开发-ArkTS语言基础类库多线程并发概述

    的一系列复杂偶发的问题,同时并发度也相对较高,因此得到了广泛的支持和使用,也是当前ArkTS语言选择的并发模型。 由于Actor模型的内存隔离特性,所以需要进行跨线程的数据序列化传输。 一、数据传输
    发表于 03-28 14:35

    鸿蒙原生应用开发-ArkTS语言基础类库多线程并发概述

    的一系列复杂偶发的问题,同时并发度也相对较高,因此得到了广泛的支持和使用,也是当前ArkTS语言选择的并发模型。 由于Actor模型的内存隔离特性,所以需要进行跨线程的数据序列化传输。 一、数据传输
    发表于 03-22 15:40

    java实现多线程的几种方式

    Java实现多线程的几种方式 多线程是指程序中包含了两个或以上的线程,每个线程都可以并行执行不同的任务或操作。
    的头像 发表于 03-14 16:55 578次阅读

    HarmonyOS如何使用异步并发能力进行开发

    一、并发概述 并发是指在同一时间段内,能够处理多个任务的能力。为了提升应用的响应速度与帧率,以及防止耗时任务对主线程的干扰,HarmonyOS系统提供了异步并发和多
    的头像 发表于 02-18 09:18 490次阅读

    线程是什么的基本单位 进程线程的本质区别

    的代码、数据以及用于执行这些代码的上下文信息。一个进程可以由一个或多个线程组成,从而并发执行多个任务。 本质区别: 资源拥有方式:进程是资源分配的基本单位,每个
    的头像 发表于 02-02 16:30 862次阅读

    mcu线程进程的区别是什么

    MCU线程进程是嵌入式系统中常见的并行执行的概念,它们之间有许多区别,包括线程进程的定义、资源管理、通信机制、执行方式等等。下面将详细介绍MCU
    的头像 发表于 01-04 10:45 692次阅读

    你还是分不清多进程和多线程吗?一文搞懂!

    你还是分不清多进程和多线程吗?一文搞懂! 多进程和多线程并发编程中常见的两个概念,它们都可以用于提高程序的性能和效率。但是它们的实现方式和
    的头像 发表于 12-19 16:07 539次阅读

    java死锁产生的条件

    Java死锁是指多个线程因为互相等待对方释放资源而无法继续执行的情况。当线程处于死锁状态时,程序会无限期地等待资源,无法继续执行下去,从而导致整个系统的停滞。要理解并避免Java死锁的
    的头像 发表于 12-04 13:42 431次阅读

    java redis锁处理并发代码

    并发编程中,一个常见的问题是如何确保多个线程安全地访问共享资源,避免产生竞态条件和数据异常。而Redis作为一种高性能的内存数据库,可以提供分布式锁的功能,通过Redis锁,我们可以有效地解决并发问
    的头像 发表于 12-04 11:04 920次阅读

    核心线程数和最大线程数怎么设置

    核心线程数和最大线程数是Java线程池中重要的参数,用来控制线程池中线程的数量和行为。正确地设置
    的头像 发表于 12-01 13:50 8754次阅读