多线程编程总结:一、认识多线程本质

在当今计算机系统中,已经大量存在多核心CPU,或者是在多核心基础上有进一步的超线程技术将虚拟CPU数量翻倍。在计算机发展之初,我们的应用程序是按照一个CPU只做一件事情来应用,也就是顺序执行。随着时间的不断变化,我们的CPU计算能力越加强大,那么我们可以使用线程技术,让每个核心都去做一件事,或者使用时间切片(time slicing)技术,让我们的CPU在各个线程中切换以同时达到一种处理多个线程任务的目标。可以同时听歌,看文档,运行时钟,挂游戏。

需要注意的是,对于时间分片技术,我们实际上是同一个核心将一个线程的运行1个时间片(time slice)的时间,然后保存状态,切换到另外一个线程去,这种切换动作被称为上下文切换。表现出来是并行运算。但是我们需要考虑到CPU不断地切换线程,实际上也会有代价,需要保存上一个线程状态,切换到下一个线程去。如果线程数目过多的情况下,就会消耗大量时间在切换线程上。这就是为什么多线程不一定会让程序更快,而需要综合衡量。

多线程并发问题:缺乏原子性、竞态条件、复杂的内存模型和死锁。

一、缺乏原子性

首先原子操作的定义是:一个原子内代码,要么处于没有操作,要么已经操作完毕,而不存在”操作中”这个中间态。核心是它是整体的,不可分割。如果我们的多线程代码如果不是原子性的,那么这种情况下它就缺乏原子性。

二、竞态条件

竞态条件是值得我们同时开启的多个线程,它的执行顺序是根据系统判断哪个线程竞争胜利,先执行到一部分,然后发生上下文切换到另外一个另外一个线程去。而至于哪个线程在竞争中胜出不可预知,就算99.99%的时间具有正确行为,那么也有0.01%会出现另外一个线程竞争胜利。

三、复杂的内存模型

现在我们的CPU不会每次运行某个变量的时候都会去内存取出操作,而是将这个变量缓存在CPU的高速缓存中,这个缓存会定时和主内存进行同步。意味着在多核心CPU中处理不同线程时,我们的线程处理的是各自CPU核心的高速缓存中的变量,实际上是2个不同的变量。那么当我们多线程对该变量进行更新时就不是准确的。

四、锁定造成死锁

C#中使用Lock语句或者Monitor.Enter() Monitor.Exit()将一段代码作为原子操作,对Lock住的该对象,系统会判断只允许一个线程访问该段Lock住代码,其他线程挂起等待。如果被Lock住的对象发生改变,其他线程访问过来的时候,系统会认为不是同一段Lock代码,就会允许那个代码访问,这就是Lock失效了。

锁本身也会出问题,例如此处有2个线程分别是A和B线程, 同时有2个锁分别是C和D,那么A线程在C锁获得之后请求D锁,而B线程在获得D锁之后请求C锁,就会造成互相等待对方释放,这就是死锁的由来。

Original: https://www.cnblogs.com/chengxingliang/p/14790267.html
Author: 程兴亮
Title: 多线程编程总结:一、认识多线程本质

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/541766/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • ITEXT7 生成PDF ,添加背景图,表格居中,以及分页表格断开的处理,图片并排, 页眉处理

    转载请注明文章出处,谢谢! 公司要求给客户生成PDF报告,本来是使用itext5,html转为pdf, 但是最后一张需要添加背景图,一直没有找到判断是否是最后一张或者说给整个pdf…

    Java 2023年6月8日
    080
  • spring 支持集中 bean scope?

    Spring bean 支持 5 种 scope: Singleton – 每个 Spring IoC 容器仅有一个单实例。 Prototype – 每次请…

    Java 2023年5月30日
    086
  • 零点问题与微分不等式

    零点问题与微分不等式 零点问题关注于”有没有解”,”有几个解”。 单调性与存在性 罗尔原话 多项式方程的根 单调性与存在性 可以使用…

    Java 2023年6月7日
    073
  • JAVA 创建也项目平级文件

    undefined String url = System.getProperty("user.dir") +"/logs/test.txt&quot…

    Java 2023年5月29日
    0112
  • Html转换PDF(Java实用版)

    前言: 在工作当中,遇到了需要把HTML页面转化为PDF文档,有很多中实现,如下进行一个对比,大家个借鉴去进行使用 各实现对比表 于Windows平台进行测试: 此博客仅基于ITe…

    Java 2023年6月8日
    0146
  • 延时任务-基于redis zset的完整实现

    所谓的延时任务给大家举个例子:你买了一张火车票,必须在30分钟之内付款,否则该订单被自动取消。 订单30分钟不付款自动取消,这个任务就是一个延时任务。 我之前已经写过2篇关于延时任…

    Java 2023年6月15日
    0103
  • 二叉树,平衡树,2-3树,红黑树

    二叉树(BST) 二叉树中,将比父结点大的数放在右结点,比父结点小的数放在左结点,查找时只需要将其跟父结点对比,大则进入右边,小则进入左边,依次往下; 但是数据本身是有序的,就导致…

    Java 2023年6月7日
    079
  • 事务、事务隔离级别、三读问题

    一、事务 二、事务隔离级别 三、三读问题 一、事务 事务定义:一组数据操作要么全成功,要么全失败。事务四大特性:ACID原子性:要么全成功,要么全失败。一致性:事务执行的结果必须是…

    Java 2023年6月8日
    075
  • PHP 实现微信红包拆分算法

    php;gutter:true; handle(); * print_r($res); * * @author Flc * @see http://flc.ren | http:/…

    Java 2023年6月7日
    071
  • 基于hashset对中文词快速查询

    下载附件”百度分词词库”, 里面大约有10w个词, 使用C语言或者Java实现单词快速查找功能(不借助第三方类库工具或者数据库), 将单词载入内存中, 建立…

    Java 2023年6月13日
    0105
  • 操作系统 进程调度 实验(C语言)

    基本要求 在进程控制实验基础上实现按先来先服务FCFS、短作业优先SJF以及时间片轮转算法调度进程的模拟过程。根据当前所设定调度算法,连续调度所有进程,并计算每个进程的周转时间和带…

    Java 2023年6月5日
    0144
  • 简单明了的设计模式-立意篇

    1.岁月的沉淀 我们为什么要学设计模式? 如果是在我刚成为程序员的时候,我大概会这么回答: 因为设计模式是前人经验的总结,可以用来解决特定环境下,重复出现的特定问题。 同时也是程序…

    Java 2023年6月15日
    091
  • java生成随机数、随机英文字母、随机字符串

    以生成4位随机数字举例说明 方式一: (int) (Math.random() * (9999 – 1000 + 1)) + 1000 说明: 随机数范围:1000~9999。 方…

    Java 2023年5月29日
    066
  • 面试常问的dubbo的spi机制到底是什么?

    前言 dubbo是一款微服务开发框架,它提供了 RPC通信 与 微服务治理 两大关键能力。作为spring cloud alibaba体系中重要的一部分,随着spring clou…

    Java 2023年6月16日
    0127
  • 一、对象与类

    1 类的三种关系:use, has, is 2 封装:数据域私有,即隐藏数据的实现方式,只提供方法去操作。所有的使用者调用即可而不需要关心实现方法的都可以称为封装。 3 java的…

    Java 2023年6月16日
    0132
  • Java代码质量监控工具Sonar安装

    Sonar是一个代码质量管理系统。它的帮助文档开篇明义,提出了代码质量的七宗罪。总结的比較到位。最好还是一看: 首先看一下sonar对安装环境的需求,见文档: http://doc…

    Java 2023年5月29日
    092
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球