为什么要用多线程

任何一项技术的出现都是为了解决现有问题。

之前的互联网大多是单机服务,体量小;而现在的更多是集群服务,同一时刻有多个用户同时访问服务器,那么会有很多线程并发访问。

比如在电商系统里,同一时刻比如整点抢购时,大量用户同时访问服务器,所以现在公司里开发的基本都是多线程的。

使用多线程确实提高了运行的效率,但与此同时,我们也需要特别注意数据的增删改情况,这就是线程安全问题,比如之前说过的 HashMap vs HashTableVector vs ArrayList

要保证线程安全也有很多方式,比如说加锁,但又可能会出现其他问题比如死锁,所以多线程相关问题会比较麻烦。

因此,我们需要理解多线程的原理和它可能会产生的问题以及如何解决问题,才能拿下高薪职位。

进程 vs 线程

程序 program

说到进程,就不得不先说说程序。

程序,说白了就是代码,或者说是一系列指令的集合。比如「微信.exe」这就是一个程序,这个文件最终是要拿到 CPU 里面去执行的。

进程 process

当程序运行起来,它就是一个进程

所以程序是“死”的,进程是“活”的

比如在任务管理器里的就是一个个进程,就是“动起来”的应用程序。

Q:这些进程是并行执行的吗?

单核 CPU 一个时间片里只能执行一个进程。但是因为它切换速度很快,所以我们感受不到,就造成了一种多进程的假象。(多核 CPU 那真的就是并行执行的了。)

Q:那如果这个进程没执行完呢?

当进程 A 执行完一个时间片,但是还没执行完时,为了方便下次接着执行,要保存刚刚执行完的这些数据信息,叫做「保存现场」。

然后等下次再抢到了资源执行的时候,先「恢复现场」,再开始继续执行。

这样循环往复。。

这样反复的保存啊、恢复啊,都是额外的开销,也会让程序执行变慢。

Q:有没有更高效的方式呢?

如果两个线程归属同一个进程,就不需要保存、恢复现场了。

这就是 NIO 模型的思路,也是 NIO 模型比 BIO 模型效率高很多的原因,我们之后再讲。

线程 thread

线程,是一个进程里的具体的执行路径,就是真正干活的。

在一个进程里,一个时间片也只能有一个线程在执行,但因为时间片的切换速度非常快,所以看起来就好像是同时进行的。

一个进程里至少有一个线程。比如主线程,就是我们平时写的 main() 函数,是用户线程;还有 gc 线程是 JVM 生产的,负责垃圾回收,是守护线程

每个线程有自己的 stack,记录该线程里面的方法相互调用的关系;

但是一个进程里的所有线程是共用堆 heap 的。

那么不同的进程之间是不可以互相访问内存的,每个进程有自己的内存空间 memeory space,也就是虚拟内存 virtual memory

通过这个虚拟内存,每一个进程都感觉自己拥有了整个内存空间。

虚拟内存的机制,就是屏蔽了物理内存的限制。

Q:那如果物理内存被用完了呢?

用硬盘,比如 windows 系统的分页文件,就是把一部分虚拟内存放到了硬盘上。

相应的,此时程序运行会很慢,因为硬盘的读写速度比内存慢很多,是我们可以感受到的慢,这就是为什么开多了程序电脑就会变卡的原因。

Q:那这个虚拟内存是有多大呢?

对于 64 位操作系统来说,每个程序可以用 64 个二进制位,也就是 2^64 这么大的空间!

如果还不清楚二进制相关内容的,公众号内回复「二进制」获取相应的文章哦~

总结

总结一下,在一个时间片里,一个 CPU 只能执行一个进程。

CPU 给某个进程分配资源后,这个进程开始运行;进程里的线程去抢占资源,一个时间片就只有一个线程能执行,谁先抢到就是谁的。

多进程 vs 多线程

每个进程是独立的,进程 A 出问题不会影响到进程 B;

虽然线程也是独立运行的,但是一个进程里的线程是共用同一个堆,如果某个线程 out of memory,那么这个进程里所有的线程都完了。

所以多进程能够提高系统的容错性 fault tolerance ,而多线程最大的好处就是线程间的通信非常方便。

进程之间的通信需要借助额外的机制,比如进程间通讯 interprocess communication - IPC,或者网络传递等等。

写在最后

可能有人会问我为什么愿意去花时间帮助大家实现求职梦想,因为我一直坚信时间是可以复制的。我牺牲了自己的大概十个小时写了这片文章,换来的是成千上万的求职者节约几天甚至几周时间浪费在无用的资源上。

上面的这些(算法与数据结构)+(Java多线程学习手册)+(计算机网络顶级教程)等学习资源我都在这里公开分享出来

以上我的经历希望能够给大家带来帮助,需要这些资料的朋友可以戳这里,就可以免费拿到了

级教程)等学习资源我都在这里公开分享出来

以上我的经历希望能够给大家带来帮助,需要这些资料的朋友可以戳这里,就可以免费拿到了

巩固知识体系!mysql变量类型相关推荐

  1. (四)JS基础知识一(深入分析变量类型和计算)【不会变量,别说你会JS】

    JS基础知识一(变量类型和计算) 提问 变量类型 值类型 vs 引用类型 (堆栈模型) 值类型 引用类型 typeof 运算符 深拷贝 变量计算 字符串拼接 == if语句和逻辑运算 if语句 逻辑判 ...

  2. 学习笔记:MySQL高阶知识体系(下)——索引、锁、日志、隔离级别与MVCC

    转载自https://www.ydlclass.com/doc21xnv/database/mysqladvance/mysqlAdvance2.html MySQL高阶知识体系(下) 6. 索引 6 ...

  3. JAVA知识体系之数据库篇——MySQL

    目录 1.一条查询语句的执行流程 1.1 MySQL基本架构 1.2 连接层 1.3 服务层 1.3.1 查询缓存 1.3.2 解析器(Parser) 词法解析 语法解析 1.3.3 预处理器(Pre ...

  4. C# 基础知识 (五).变量类型和字符串处理

            这篇文章是阅读<C#入门经典(Beginning C#)>书籍里面的内容,作者Karli Watson.主要包括自己缺乏的一些C#基础知识和在线笔记使用,文章主要包括C#简 ...

  5. mysql性能分析三驾马车_MySQL知识体系的三驾马车

    MySQL知识体系的三驾马车 在我看来要掌握好MySQL的话要理解好这三个东西: 索引(B+树) 日志(WAL) 事务(可见性) 索引决定了查询的性能,也是用户感知到的数据库的关键所在,日常使用过程中 ...

  6. C++知识总结(1)--变量和基本类型

    最近打算看看<C++ primer>,重新复习C++的一些知识点,同时会添加部分在做牛客网编程题目时候记录的知识点. 变量和基本类型 endl操纵符的效果是结束当前行,并将与设备关联的缓冲 ...

  7. 十五、MySQL变量(系统变量、自定义变量)相关知识总结

    变量: 系统变量: a.全局变量 b.会话变量 自定义变量: a.用户变量 b.局部变量 一.系统变量 说明:变量由系统定义,不是用户定义,属于服务器层面 注意:全局变量需要添加global关键字,会 ...

  8. JS——基础知识--变量类型和变量计算

    提问: JS中使用typeof能得到的哪些类型 何时使用===何时使用== JS中有哪些内置函数 JS变量按照存储方式区分为哪些类型,并描述其特点 如何理解JSON 涉及知识点:(1)变量类型 值类型 ...

  9. PHP7内核基础知识之变量类型

    前言 下面我们大概了解下PHP7的变量类型都有哪些,是如何存储变量的. zval结构定义 PHP7中是使用zval结构存储变量信息的.zval结构的定义在./Zend/zend_types.h文件中定 ...

最新文章

  1. Numpy中的meshgrid()函数
  2. UriComponentsBuilder 拼接URL、解析URL
  3. 设置progressbar进度条颜色
  4. 《圣殿祭司的ASP.NET4.0专家技术手册》----导读
  5. memcache 源码分析之开场白
  6. 编译OpenJDK8:CoreLibraries.gmk:37/e_acos.obj/BuildJdk.gmk:70/Main.gmk:116/错误
  7. 2017CV技术报告:从3D物体重建到人体姿态估计
  8. javascript 自带函数 读取json文件
  9. Python软件下载与安装教程
  10. 【每日一题】 480. 滑动窗口中位数
  11. # 你也可以在你的微信 or QQ头像添加小国旗了,超简单!
  12. android获取键盘状态,Android获取屏幕方向及键盘状态的小例子
  13. ubuntu18.04配置静态ip
  14. iOS9有哪些新特性
  15. 高中计算机公式,求高中数学公式大全,高二数学公式总结
  16. 0基础SUMO简单入门小实例
  17. 界面适配华为手机的虚拟按键的解决方案
  18. c 语言filter过滤方法,R语言日常笔记(1)filter函数
  19. 使用Astah制作UML时序图
  20. dz论坛使用tools修改创始人密码

热门文章

  1. 中国水下充气袋行业市场供需与战略研究报告
  2. 2021年中国助行靴市场趋势报告、技术动态创新及2027年市场预测
  3. 小米手机不弹出usb连接设置_安卓手机数据备份教程(华为、小米、oppo、vivo)...
  4. 做游戏,学编程(C语言) 4 flappy bird
  5. 马斯克亲口承认:自动驾驶的开发难度超乎想象;小米再发1.2亿股权激励;Firefox Lite 已死|极客头条...
  6. 倒计时 1 天!第十六届开源中国开源世界高峰论坛日程曝光,邀您共同缔造开源创新模式!...
  7. 论一切都是文件之匿名 inode
  8. 每天生成 45 亿字符的 GPT-3,真能取代人工?
  9. ​苏宁回应股权质押给淘宝:正常合作;苹果App Store被越狱商店指控垄断;Docker 20.10.0发布|极客日报...
  10. 无需训练 RNN 或生成模型,如何编写一个快速且通用的 AI “讲故事”项目?