其实讲到并发编程,有时候会问自己为什么要去做这些知识的积累和沉淀,可能我们做业务的在职业生涯里,并不会经常使用到这些所谓的多线程编程,顶多可能开一个线程,去执行个任务,又或者通过定时器触发某个业务,实际的业务开发中,几乎很少用到这类知识。相反,对于一些大厂的中间件开发团队,或者底层的开发工程师甚至架构师,都一定是很熟悉并发编程,甚至精通;所以我认为,有必要整理出来,作为架构师路上的自己一份积累和鼓励,日后可以多回顾,不为面试,只为做更好的自己!

1、大纲简介

本章开始进行由浅入深的讲解,深度剖析并发编程底层的相关原理,大纲简介如下:

2、预备知识和环境

  • 希望你不是一个零基础初学者
  • 线程安全问题,需要你接触过 Java Web开发、Jdbc开发、Web服务器、分布式框架时才会遇到
  • 基于 JDK 8,最好对函数式编程、lambda 有一定了解
  • 采用了 slf4j 打印日志,这是好的实践
  • 采用了 lombok 简化 java bean 编写
  • 给每个线程好名字,这也是一项好的实践

环境我这里采用Maven,其他的代码后续贴出。

3、什么是进程

首先,程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。

在指令运行过程中还需要用到磁盘、网络等设备。那么谁来干这些事情呢?所以出现了进程,进程是用来加载指令、管理内存、管理 IO的。

当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。 进程就可以视为程序的一个实例。大部分程序可以同时运行多个实例进程,例如记事本、画图、浏览器;记事本可以开多个分别运行,浏览器也可以开多个,但是也有的程序只能启动一个实例进程,例如网易云音乐、360 安全卫士;没见过开两个360在杀毒的吧?由程序本身的性质决定。

4、什么是线程

一个进程之内可以分为一到多个线程。

一个线程就是一个指令流,将指令流中的一条条指令以一定的顺序交给CPU执行,在Java 中,线程作为最小调度单位进程作为资源分配的最小单位

那么进程和线程的区别在哪里?

  • 进程基本上相互独立的,而线程存在于进程内,是进程的一个子集;
  • 进程拥有共享的资源,如内存空间等,供其内部的线程共享;
  • 进程间通信较为复杂,同一台计算机的进程通信称为 IPC(Inter-process communication),不 同计算机之间的进程通信,需要通过网络,并遵守共同的协议,例如 HTTP;
  • 线程通信相对简单,因为它们共享进程内的内存,一个例子是多个线程可以访问同一个共享变量,而这个变量存在一个Java虚拟机进程中。
  • 线程更轻量,线程上下文切换成本一般上要比进程上下文切换低,但是也要消耗资源。

5、什么是并发和并行

讲并发前我先给个图,在单核 cpu 下,线程实际还是串行执行的。操作系统中有一个组件叫做任务调度器,将 cpu 的时间片(windows 下时间片最小约为 15 毫秒)分给不同的程序使用,只是由于 cpu 在线程间(时间片很短)的切换非常快,给人类感觉是同时运行的。总结为一句话就是: 微观串行,宏观并行。

一般会将这种——线程轮流使用 CPU 的做法称为并发, concurrent

而在多核cpu下,每个核(core)都可以调度运行线程,这时候线程可以是并行的。

引用 Rob Pike 的一段描述:

 并发(concurrent)是同一时间应对(dealing with)多件事情的能力

并行(parallel)是同一时间动手做(doing)多件事情的能力

例子:

家庭主妇做饭、打扫卫生、给孩子喂奶,她一个人轮流交替做这多件事,这时就是并发;

家庭主妇雇了个保姆,她们一起这些事,这时既有并发,也有并行(这时会产生竞争,例如锅只有一口,一 个人用锅时,另一个人就得等待);

雇了3个保姆,一个专做饭、一个专打扫卫生、一个专喂奶,互不干扰,这时是并行;

6、什么是同步和异步

以调用方角度来讲,如果需要等待结果返回,才能继续运行就是同步

        不需要等待结果返回,就能继续运行就是异步

        举个例子,左边的log发日志要等FileReader读完后,才会打印,而右边开个线程,由cpu自行调度,不影响下面的log执行。

多线程可以让方法执行变为异步的(即不要巴巴干等着)比如说读取磁盘文件时,假设读取操作花费了 5 秒钟,如 果没有线程调度机制,这 5 秒 cpu 什么都做不了,其它代码都得暂停...

再举个例子,充分利用多核 cpu 的优势,提高运行效率。想象下面的场景,执行 3 个计算,最后将计算结果汇总。

计算 1 花费 10 ms

计算 2 花费 11 ms

计算 3 花费 9 ms

汇总需要 1 ms

如果是串行执行,那么总共花费的时间是 10 + 11 + 9 + 1 = 31ms,但如果是四核 cpu,各个核心分别使用线程 1 执行计算 1,线程 2 执行计算 2,线程 3 执行计算 3,那么 3 个线程是并行的,花费时间只取决于最长的那个线程运行的时间,即 11ms 最后加上汇总时间只会花费12ms。注意:需要在多核 cpu 才能提高效率,单核仍然时是轮流执行。

7、小结

单核 cpu 下,多线程不能实际提高程序运行效率,只是为了能够在不同的任务之间切换,不同线程轮流使用 cpu,不至于一个线程总占用 cpu,别的线程没法干活。

多核 cpu 可以并行跑多个线程,但能否提高程序运行效率还是要分情况的,有些任务经过精心设计,将任务拆分,并行执行,当然可以提高程序的运行效率。但不是所有计算任务都能拆分,也不是所有任务都需要拆分,任务的目的如果不同,谈拆分和效率没啥意义。

IO 操作不占用 cpu,只是我们一般拷贝文件使用的是【阻塞 IO】,这时相当于线程虽然不用 cpu,但需要一直等待 IO 结束,没能充分利用线程。所以才有后面的【非阻塞 IO】和【异步 IO】优化。

下一节开始Java线程的讲解。

并发编程基础篇——第一章(并发相关基础概念理解)相关推荐

  1. 第一篇第一章燃烧的基础知识

    2019/1/3 [录播]2018一消精华班-实务-一级消防工程师-环球网校 http://v.edu24ol.com/?type=lesson&id=178941&gid=16157 ...

  2. 大学计算机基础试题第一章,大学计算机基础试题第一章

    大学计算机基础试题第一章 第一章 一.必答题 [1]. 与信息技术中的感测.存储.通信等技术相比,计算技术主要用于扩展人的_C_______器官的功能. A. 感觉 B. 神经网络 C. 思维 D. ...

  3. python第一个发行版本由c语言实现_1 晓白的python逆袭之旅基础篇---第一章

    第一章 来自晓白的困惑 1人物介绍晓白:一位即将毕业,踏入社会的大学生,对自己的前途充满了困惑,对计算机编程感兴趣,想以后进入互联网行业,从事开发工作,但是不知如何开始. 老袁:晓白的学长,同时也是晓 ...

  4. 鸟哥的Linux私房菜(基础篇)-第一章、Linux是什么(一.2. Torvalds的Linux发展)

    第一章.Linux是什么 最近更新日期:2009/08/05 2. Torvalds的Linux发展 2.1 与Minix之间 2.2 对386硬件的多任务测试 2.3 初次释出Linux 0.02 ...

  5. 鸟哥的Linux私房菜(基础篇)-第一章、Linux是什么(一.1.Linux是什么)

    第一章.Linux是什么 最近更新日期:2009/08/05 1. Linux是什么 1.1 Linux是什么 1.2 Linux之前,Unix的历史 1.3 关于GNU计划 Linux是什么 我们知 ...

  6. [并发编程]并发编程第二篇:利用并发编程,实现计算大量数据的和

    利用并发编程,实现计算大量数据的和 实现代码: package tj.pojo.generate.main;import java.util.ArrayList; import java.util.L ...

  7. 穿越Java - 基础篇 第一章 快速带你入门 | 第3节 Java语言发展史

    主题:Java语言发展史 开发环境 更多干货 发展史 开发环境 基于:IntelliJ IDEA.Maven构建工具.JDK1.8.SpringBoot 2.3.4 .Spring4.3.28编写. ...

  8. 鸟哥的Linux私房菜(基础篇)-第一章、Linux是什么(一.4. 重点回顾)

    第一章.Linux是什么 最近更新日期:2009/08/05 4. 重点回顾 5. 本章习题 6. 参考数据与延伸阅读 7. 针对本文的建议:http://phorum.vbird.org/viewt ...

  9. 鸟哥的Linux私房菜(基础篇)-第一章、Linux是什么(一.3. Linux的特色)

    第一章.Linux是什么 最近更新日期:2009/08/05 3. Linux的特色 3.1 Linux的特色 3.2 Linux的优缺点 3.3 关于授权 Linux的特色 Linux是Torval ...

最新文章

  1. C#调用存储过程简单完整例子
  2. hp服务器硬件安装,HP Gen8 服务器安装2008 R2 帮助手册
  3. L车改装浅析及性能测试
  4. PL/Sql Dev 调试Oracle存储过程、触发器、函数
  5. Go的Ducktype
  6. shiro 的 @RequiresPermissions 注解使用
  7. 前端如何设置背景颜色的透明度 css中的 rgba() 函数详解 :background-color: rgba(255,192,203,0.3)
  8. 2020 Intel数据平面创新赋能未来网络-李雪峰
  9. File指定过滤器得到需要的文件
  10. maven项目建立pom xml报无法解析org apache maven plugins maven resource
  11. 动态规划实战16 leetcode-198. House Robber
  12. 【快速迭代】【原型开发】
  13. Oracle11g 创建表空间、查看表空间以及扩展表空间
  14. SYSLINUX 中文简介(怎样使用)
  15. 联想z400linux调节屏幕亮度,联想Z400电脑显示屏亮度无法调节怎么办
  16. html边框如何制作三角形,如何用css3绘制有边框的三角形
  17. 【Mockplus教程】如何修改手机外壳?
  18. 知乎上那些简短却非常深刻的回答
  19. w10用计算机卸载,win10系统内置应用卸载方法
  20. 工作中常用pgsql函数

热门文章

  1. Python 自动化办公之 Excel 拆分并自动发邮件
  2. 践行科技向善,腾讯Light 把光引向厦门
  3. 从程序媛到启明星辰集团云安全总经理,郭春梅博士揭秘云时代安全攻防之道...
  4. “Jupyter的杀手”:Netflix发布新开发工具Polynote
  5. 解决掉这些痛点和难点,让知识图谱不再是“噱头”
  6. 全球超2万名开发者调研:Python 3渗透率至84%
  7. GitHub重大好消息:私有仓库可无限制免费创建
  8. 学术 | 一种新的CNN网络可以更高效地区分自然图像生成图像
  9. 【重磅】吴恩达又一项目Landing.ai曝光,这一次,他是要给传统制造业狠狠开刀!
  10. 跨界 | 土木工程也开始AI化了:用卷积神经网络实现结构损伤视觉识别