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
    +关注

    关注

    20

    文章

    2997

    浏览量

    115683
  • 线程
    +关注

    关注

    0

    文章

    508

    浏览量

    20759
  • 进程
    +关注

    关注

    0

    文章

    208

    浏览量

    14478
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Linux多线程对比单线程的优势

    。「提高响应性」:线程可以使程序更加响应用户输入或其他事件,避免阻塞。线程相比单线程的优点:「并发性」:多线程可以同时执行多个任务,而单
    发表于 12-01 06:11

    飞凌嵌入式ElfBoard-文件I/O的了解探究之竞争冒险

    竞争冒险(Race Condition)指的是在多线程或多进程环境中,多个线程进程对共享资源进行访问和修改时可能导致的不确定性结果或错误行为。竞争冒险通常发生在多个
    发表于 11-26 15:38

    【HZ-T536开发板免费体验】—— linux创建线程

    线程进程 一个进程指的是一个正在执行的应用程序,而线程的功能是执行应用程序中的某个具体任务。线程具有传统
    发表于 09-01 21:31

    Task任务:LuatOS实现“任务级并发”的核心引擎

    Task任务通过其强大的并发处理能力,使LuatOS能够在单线程环境中模拟多线程执行,通过协程的挂起与恢复机制,实现任务级的并行操作,显著提升系统效能。 sys核心库是LuatOS运行框架库,也是
    的头像 发表于 08-28 13:49 338次阅读
    Task任务:LuatOS实现“任务级<b class='flag-5'>并发</b>”的核心引擎

    缓存之美:从根上理解 ConcurrentHashMap

    表的占用,以保持并发可读性,次要目的是保持空间消耗与 HashMap 相同或更好,并支持利用多线程在空表上高效地插入初始值。在 Java 8 及之后的版本,使用 CAS 操作
    的头像 发表于 08-05 14:48 417次阅读

    什么是ArkTS?

    基础类库能力示意图 提供异步并发和多线程并发的能力。 支持Promise和async/await等标准的JS异步并发能力。 TaskPool为应用程序提供一个多
    发表于 06-17 06:24

    鸿蒙5开发宝藏案例分享---应用并发设计

    ?** 鸿蒙并发编程实战指南:解锁ArkTS多线程黑科技** 嘿,开发者朋友们! 今天给大家扒一扒鸿蒙官方文档里藏着的并发编程宝藏—— 100+实战场景解决方案 !从金融理财到游戏开发,从折叠屏适配
    发表于 06-12 16:19

    HarmonyOS实战:一招解决等待多个并发结果

    讲解开发过程中遇到的并发问题,官方API 11文档写的太简单了,根本没有解决方案,小编也是苦思冥想,绞尽脑汁才找到解决方案。需要开发鸿蒙的小伙伴可以仔细阅读,避免踩坑。** 问题 在开发清除缓存的功能时,鸿蒙NEXT提供的文档中说明,应用缓存文件
    的头像 发表于 06-09 14:57 402次阅读
    HarmonyOS实战:一招解决等待多个<b class='flag-5'>并发</b>结果

    存储示波器的触发问题及解决办法

    触发功能是示波器的核心,用于稳定显示信号波形。触发问题通常导致波形抖动、不完整或无法捕获目标事件。以下是常见触发问题及针对性解决方案:一、触发问题分类与原因1. 无法触发(波形不显示或不稳定) 原因
    发表于 04-09 14:39

    Linux进程状态详解

    进程状态是task_struct内的一个整数;进行:进程在调度队列中,进程的状态都是running,阻塞:等待某种设备或者资源就绪。进程是一个队列,设备也是一个队列,当我们读磁盘,读网
    的头像 发表于 04-01 09:46 810次阅读
    Linux<b class='flag-5'>进程</b>状态详解

    进程线程、协程傻傻分不清?一文带你彻底扒光它们的\"底裤\"!

    是(每个进程可以跑在不同CPU) 是(线程可以分配到不同核) 否(只能在一个核上蹦迪) 适用场景 银行系统、docker容器 视频渲染、实时音视频 微信客服、高并发Web服务器 社死案例
    发表于 03-26 09:27

    请问如何在Python中实现多线程与多进程的协作?

    大家好!我最近在开发一个Python项目时,需要同时处理多个任务,且每个任务需要不同的计算资源。我想通过多线程和多进程的组合来实现并发,但遇到了一些问题。 具体来说,我有两个任务,一个是I/O密集型
    发表于 03-11 06:57

    摩尔线程支持DeepSeek开源通信库DeepEP和并行算法DualPipe

    DeepSeek开源周第四日,摩尔线程宣布已成功支持DeepSeek开源通信库DeepEP和并行算法DualPipe,并发布相关开源代码仓库:MT-DeepEP和MT-DualPipe。
    的头像 发表于 02-28 15:58 847次阅读

    RK3568驱动指南|第三篇-并发与竞争-第19章 并发与竞争实验

    RK3568驱动指南|第三篇-并发与竞争-第19章 并发与竞争实验
    的头像 发表于 02-24 16:26 851次阅读
    RK3568驱动指南|第三篇-<b class='flag-5'>并发</b>与竞争-第19章 <b class='flag-5'>并发</b>与竞争实验

    开源大模型DeepSeek的开放内容

    当大家讨论为什么 DeepSeek 能够形成全球刷屏之势,让所有厂商、平台都集成之时,「开源」成为了最大的关键词之一,图灵奖得主 Yann LeCun 称其是「开源的胜利」。模型开源一直备受关注,从代码、数据到模型的完全开源是人们渴求的方向。那么 DeepSeek 的开源究竟开放了什么?开放到了何种程度?本文作者——资深程序员+资深律师,一起为大家拆解 DeepSeek 的开源之道。 【写在前面】DeepSeek 是目前可以和闭源大模型媲美的开源大模型,DeepSeek 许可证是
    的头像 发表于 02-19 09:48 2422次阅读
    开源大模型DeepSeek的开放内容<b class='flag-5'>详</b><b class='flag-5'>析</b>