我们为什么要学并发编程?

  • 1. 为什么要并发编程?
    • 1.1 面试需要
    • 1.2 性能调优
      • (1)加快响应时间
      • (2)代码模块化、异步化
      • (3)充分利用 CPU 的资源
  • 2. 并发编程的基础概念
    • 2.1 进程和线程
      • (1)进程(Process):一段程序的执行过程,操作系统资源分配的基本单位
      • (2)线程(Thread):处理器任务调度和执行的基本单位
      • (3)进程间通信有几种方式?
    • 2.2 CPU的核心数和线程数的关系
    • 2.3 上下文切换(Context switch)
    • 2.4 并发和并行
      • (1)并发
      • (2)并行

1. 为什么要并发编程?

1.1 面试需要


可以看到,在互联网大厂 Java 开发岗的并发编程属于标配。当然,在中小型企业并发编程的能力也是加分项,在工作中善用并发编程不仅能提高公司项目的使用体验,也能提升程序员在公司的技术话语权。

1.2 性能调优

(1)加快响应时间

举个栗子:北漂的程序员通勤动辄一两个小时,通勤时间大家都干什么呢?那当时是看网课提升自己或者追剧打发时间,这时大多数同学应该都会缓存视频,多线程就派上用场了:可以多个视频一起缓存下载。

再比如:日常开发中,尤其是互联网项目,作为一名 Java 程序员,总是想发设法提升方法/接口响应速度(调用一个复杂逻辑的接口,响应时间控制在 1s);在做 web 前端调优时:一般会将静态资源地址用两三个子域名去加载,每多一个子域名,浏览器在加载页面的时候就会多开几个线程去加载你的页面资源,提升网站的响应速度。

(2)代码模块化、异步化

举个栗子:电商系统中的订单履约流程:下单和给用户发短信/邮件就可以进行拆分,使之异步化,下单主流程同步执行,发送短信/邮件可以另起线程异步执行。这样既增加了异步的操作,提升了系统性能,又使程序模块化、可读性大大提升。

(3)充分利用 CPU 的资源

目前的 CPU 都是多个核心的,多核 CPU 下还使用单线程编程,不仅略显小 low,还无法发挥 CPU 多核的优势。

就如同上面举的北漂程序员喜欢在地铁上看网课、刷博客提升自己一样:在坐地铁的同时看网课、刷博客,回到家以后继续看网课、刷博客,这样你的时间就相当于有了两倍!这就是为什么有些人时间很充裕,而有些人老是说没时间的一个原因。工作也是这样,有的时候可以并发地去做几件事情,充分利用我们的时间。CPU 也是一样,也要充分利用。

当然有同学会有疑问,单核 CPU 呢?单核 CPU 一样可以利用到并发编程的好处吗?

当然可以,用我们平时常用的 QQ 之类的聊天程序来举例,当我们用 QQ 聊天时,其实程序要做好几件事,比如:接受我们的键盘输入,把输入的信息通过网络发给对方,接受对方通过网络发来的信息,把对方的信息显示在屏幕上,很多的时候,这些事情是可以同时发生的。如果程序不能利用并发编程同时处理,我们和对方的通话就只能一问一答的方式进行了。

2. 并发编程的基础概念

2.1 进程和线程

(1)进程(Process):一段程序的执行过程,操作系统资源分配的基本单位

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。@百科

(2)线程(Thread):处理器任务调度和执行的基本单位

线程(Thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。@百科

(3)进程间通信有几种方式?

同一台计算机的进程通信称为 IPC(Inter-process communication),不同计算机之间的进程通信被称为 R(mote)PC,需要通过网络,并遵守共同的协议,比如大家熟悉的 Dubbo 就是一个 RPC 框架,而 http 协议也经常用在 RPC 上,比如 SpringCloud 微服务。

大厂常见的面试题就是,进程间通信有几种方式?

  1. 管道,分为匿名管道(pipe)及命名管道(named pipe):匿名管道可用于具有亲缘关系的父子进程间的通信,命名管道除了具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。

  2. 信号(signal):信号是在软件层次上对中断机制的一种模拟,它是比较复杂的通信方式,用于通知进程有某事件发生,一个进程收到一个信号与处理器收到一个中断请求效果上可以说是一致的。

  3. 消息队列(message queue):消息队列是消息的链接表,它克服了上两种通信方式中信号量有限的缺点,具有写权限得进程可以按照一定得规则向消息队列中添加新信息;对消息队列有读权限得进程则可以从消息队列中读取信息。

  4. 共享内存(shared memory):可以说这是最有用的进程间通信方式。它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据得更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等。

  5. 信号量(semaphore):主要作为进程之间及同一种进程的不同线程之间得同步和互斥手段。

  6. 套接字(socket):这是一种更为一般得进程间通信机制,它可用于网络中不同机器之间的进程间通信,应用非常广泛。同一机器中的进程还可以使用 Unix domain socket(比如同一机器中 MySQL 中的控制台 mysql shell 和 MySQL 服务程序的连接),这种方式不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等,比纯粹基于网络的进程间通信肯定效率更高。

2.2 CPU的核心数和线程数的关系

前面说过,目前主流 CPU 都是多核的,线程是 CPU 调度的最小单位。同一时刻,一个 CPU 核心只能运行一个线程,也就是 CPU 内核和同时运行的线程数是 1:1 的关系,也就是说 8 核 CPU 同时可以执行 8 个线程的代码。但 Intel 引入超线程技术后,产生了逻辑处理器的概念,使核心数与线程数形成 1:2 的关系。在我们前面的 Windows 任务管理器贴图就能看出来,内核数是 6 而逻辑处理器数是 12。

在 Java 中提供了 Runtime.getRuntime().availableProcessors(),可以让我们获取当前的 CPU 核心数,注意这个核心数指的是逻辑处理器数。

获得当前的 CPU 核心数在并发编程中很重要,并发编程下的性能优化往往和 CPU 核心数密切相关。

2.3 上下文切换(Context switch)

既然操作系统要在多个进程(线程)之间进行调度,而每个线程在使用 CPU 时总是要使用 CPU 中的资源,比如 CPU 寄存器和程序计数器。这就意味着,操作系统要保证线程在调度前后的正常执行,所以,操作系统中就有上下文切换的概念,它是指 CPU(中央处理单元)从一个进程或线程到另一个进程或线程的切换。

上下文是 CPU 寄存器和程序计数器在任何时间点的内容。

寄存器是 CPU 内部的一小部分非常快的内存(相对于 CPU 内部的缓存和 CPU 外部较慢的 RAM 主内存),它通过提供对常用值的快速访问来加快计算机程序的执行。

程序计数器是一种专门的寄存器,它指示 CPU 在其指令序列中的位置,并保存着正在执行的指令的地址或下一条要执行的指令的地址,这取决于具体的系统。

上下文切换可以更详细地描述为内核(即操作系统的核心)对 CPU 上的进程(包括线程)执行以下活动:

  1. 暂停一个进程的处理,并将该进程的 CPU 状态(即上下文)存储在内存中的某个地方;

  2. 从内存中获取下一个进程的上下文,并在 CPU 的寄存器中恢复它;

  3. 返回到程序计数器指示的位置(即返回到进程被中断的代码行)以恢复进程。

从数据来说,以程序员的角度来看, 是方法调用过程中的各种局部的变量与资源; 以线程的角度来看, 是方法的调用栈中存储的各类信息。

引发上下文切换的原因一般包括:线程、进程切换、系统调用等等。上下文切换通常是计算密集型的,因为涉及一系列数据在各种寄存器、 缓存中的来回拷贝。就 CPU 时间而言,一次上下文切换大概需要 5000~20000 个时钟周期,相对一个简单指令几个乃至十几个左右的执行时钟周期,可以看出这个成本的巨大。

2.4 并发和并行

(1)并发

并发(Concurrent):指应用能够交替执行不同的任务,比如单 CPU 核心下执行多线程并非是同时执行多个任务,如果你开两个线程执行,就是在你几乎不可能察觉到的速度不断去切换这两个务,已达到 “同时执行效果”,其实并不是的,只是计算机的速度太快,我们无法察觉到而已。

(2)并行

并行(Parallel):指应用能够同时执行不同的任务,例:坐地铁的时候可以同时坐地铁和看书,这两件事情可以同时执行。

Erlang 之父 Joe Armstrong 曾经用一张非常简单易懂的图解释了 「并发」与「并行」的区别

「并发」 是同学们排成两队,然而却只有一个咖啡机在工作,所以两个队列排在前面的同学交替使用咖啡机;「并行」 则是两台咖啡机分别服务两个独立的同学队列,它们同时进行,互不干扰。

【Java 并发编程】我们为什么要学并发编程?相关推荐

  1. 新疆有没有教电脑编程C语言,新疆学习电脑编程,新疆学电脑编程哪里好,新疆学电脑编程效果怎么样...

    新疆学习电脑编程,新疆学电脑编程哪里好,新疆学电脑编程效果怎么样 首页 > 软件 > 新疆学习电脑编程 作者:镀金池   发布时间:2018-11-02 20:40 客岁年末,微软再次发力 ...

  2. 昆山学python_昆山学习电脑编程,昆山学电脑编程哪里好,昆山学电脑编程一般能拿多少工资...

    昆山学习电脑编程,昆山学电脑编程哪里好,昆山学电脑编程一般能拿多少工资 首页 > 软件 > 昆山学习电脑编程 作者:镀金池   发布时间:2018-08-10 16:20 将后缀名为.bu ...

  3. java安卓编程计算器_菜鸟学Android编程——简单计算器《一》

    菜鸟瞎搞,高手莫进 本人菜鸟一枚,最近在学Android编程,网上看了一些视频教程,于是想着平时手机上的计算器应该很简单,自己何不尝试着做一个呢? 于是就冒冒失失的开撸了. 简单计算器嘛,功能当然很少 ...

  4. 为什么叫python编程-中小学生为什么要学Python编程

    中小学生为什么要学Python编程?未来是人工智能的时代,有理由相信Python将发挥更大的作用. 教育部下发的<2018年度普通高等学校本科专业备案和审批结果的通知>显示,新增备案本科专 ...

  5. 编程软件python-零基础学Python编程需要安装什么软件?

    前言 Python现在非常火,语法简单而且功能强大,很多同学都想学Python!所以小的给各位看官们准备了高价值Python学习视频教程及相关电子版书籍,都放在了文章结尾,欢迎前来领取! 今天想要跟大 ...

  6. 灵宝机器人编程学校_南宁学机器人编程的学校

    南宁学机器人编程的学校|可来南宁童程童美青少儿编程培训学校,童程童美在南宁青秀区.西乡塘区等开设校区,线下可学编程,线上也可学习,线上线下同步教学,方便家长选择.南宁童程童美设有试听课,欢迎广大家长预 ...

  7. GUI编程介绍,为什么学GUI编程,监听到底是怎么一回事?

    文章目录 1.关于GUI编程 1.1 简介 1.2 GUI 介绍 1.3 GUI 的好处 1.4 GUI 的基本组件内容 2. GUI 的核心 2.1 java.awt.*; 2.2 Swing 3. ...

  8. java 跟软帝-攀哥学做编程 飞机大战4

    package ui; import javax.swing.*; /** 游戏窗体 java窗体类JFrame */ public class GameFrame extends JFrame { ...

  9. 学会python编程容易吗-老男孩学Python编程后薪资待遇高吗?

    一.人工智能 Python作为人工智能的黄金语言,选择人工智能作为就业方向是理所当然的,而且就业前景好,薪资普遍较高,拉勾网上,人工智能工程师的招聘起薪普遍在20K-35K,当然,如果是初级工程师,起 ...

  10. 中学生计算机编程大赛有哪些,学了编程可以参加哪些含金量高的比赛?

    小学生可以参加的竞赛 1. 全国青少年创意编程与智能设计大赛 2. 谷歌全国中小学生计算思维编程挑战赛 3. 全国中小学生电脑制作大赛 初中生可以参加的竞赛 1. 全国青少年创意编程与智能设计大赛 2 ...

最新文章

  1. 2014年个人工作总结
  2. javascript回调函数笔记
  3. 字符串转bigdecimal类型_BigDecimal你会用吗?
  4. webstorm中配置vue代码片段
  5. 揭示Win32 API拦截细节/API hooking revealed (1)
  6. 【数据平台】dataframe一列成多列
  7. javafx FlowPane布局
  8. Android EventBus 3.0.0 使用总结
  9. php算法学习,php算法学习之动态规划
  10. Spring+ehcache缓存实例
  11. 调试windows服务
  12. ssh WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
  13. Go 语言“助力”恶意软件?仅 4 年基于 Go 的恶意软件数就激增 2000%!
  14. php smarty 语法,5. Smarty基本语法
  15. Android如何实现实时音视频会议的背景分割
  16. mysql 减去一月_sql – 如何从日期列中减去一个月
  17. 【视频】0基础趣学SEO,引爆流量,让客户主动找上门的躺赚神技
  18. 无线蓝牙耳机哪个品牌好?蓝牙降噪耳机品牌推荐
  19. 36种漂亮的网页Button按钮样式
  20. ubuntu上传文件到百度网盘

热门文章

  1. JAVA里面继承和接口
  2. 香港计算机翻译博士,香港城市大学博士offer一枚-指南者留学
  3. IMF: Interactive Multimodal Fusion Model for Link Prediction
  4. C ++ 程序调用CUDA静态库
  5. 单片机传输信息到服务器,单片机传数据到云服务器
  6. RTMP摄像机无法成功推流到EasyDSS是什么原因?如何解决?
  7. Java中Set Map List 的区别
  8. 永恒之蓝漏洞获取桌面截图
  9. openwrt 遍译php_【教程笔记】用OpenWRT单独编译ipk插件
  10. Catalan卡特兰数