前言

疫情过去,真正的春暖花开又回来了,时不时的可以和朋友约个饭,感慨今年的工作竞争压力很大,工作很不好找。作为一个开发人员,你是否面上了理想的公司,拿到了理想中的薪资?

作为程序员,跳槽就是最好的涨薪方式。前提当然是你有足够实力,而不是只会纸上谈兵。面试准备不充分,就是浪费时间,更是对自己不负责任。

今天给大家分享一份由粉丝投稿,我精心整理出来的一份1200页Java架构面试专题(文末见面试答案),绝大部分都是一线大厂的面试真题,可以根据这份面试专题查漏补缺,希望能够帮助你尽快找到工作!

为什么要用多线程

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

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

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

使用多线程确实提高了运行的效率,但与此同时,我们也需要特别注意数据的增删改情况,这就是线程安全问题,比如之前说过的 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,或者网络传递等等。

总结:绘上一张Kakfa架构思维大纲脑图(xmind)

其实关于Kafka,能问的问题实在是太多了,扒了几天,最终筛选出44问:基础篇17问、进阶篇15问、高级篇12问,个个直戳痛点,不知道如果你不着急看答案,又能答出几个呢?

若是对Kafka的知识还回忆不起来,不妨先看我手绘的知识总结脑图(xmind不能上传,文章里用的是图片版)进行整体架构的梳理

资料领取方式:点击这里免费下载

梳理了知识,刷完了面试,如若你还想进一步的深入学习解读kafka以及源码,那么接下来的这份《手写“kafka”》将会是个不错的选择。

  • Kafka入门

  • 为什么选择Kafka

  • Kafka的安装、管理和配置

  • Kafka的集群

  • 第一个Kafka程序

  • Kafka的生产者

  • Kafka的消费者

  • 深入理解Kafka

  • 可靠的数据传递

  • Spring和Kafka的整合

  • SpringBoot和Kafka的整合

  • Kafka实战之削峰填谷

  • 数据管道和流式处理(了解即可)

  • 可靠的数据传递

  • Spring和Kafka的整合

  • SpringBoot和Kafka的整合

  • Kafka实战之削峰填谷

  • 数据管道和流式处理(了解即可)

[外链图片转存中…(img-CI8Ywgmh-1624679884992)]

Java多线程从基础到并发模型统统帮你搞定相关推荐

  1. Java高级工程师必看系列,从基础到源码统统帮你搞定

    1.Java基础 Java基础务必要有一个非常牢固的根基,尤其是对于JVM和并发编程的掌握情况**(属于进阶内容,但也是Java最为重要的基础内容)**,不论是面试还是工作,基础不好,写不出高质量.漂 ...

  2. Mybatis源码解析:从基础到源码统统帮你搞定,使用指南

    个人背景 如标题所示,我的个人背景非常简单,Java开发经验1年半,学历普通,2本本科毕业,毕业后出来就一直在Crud,在公司每天重复的工作对我的技术提升并没有什么帮助,但小镇出来的我也深知自我努力的 ...

  3. a类不确定度计算器_统统帮您搞定:LIMS系统,换版、内审、期间核查、不确定度、数据分析…………...

    CNAS实验室认可ISO17025三年的过渡期,所有获认可实验室应在2020年11月30日前完成新版CL01的转换工作.实验室转换工作的完成以取得依据ISO/IEC17025:2017颁发的认可证书为 ...

  4. Java多线程学习处理高并发问题

    在程序的应用程序中,用户或请求的数量达到一定数量,并且无法避免并发请求.由于对接口的每次调用都必须在返回时终止,因此,如果接口的业务相对复杂,则可能会有多个用户.调用接口时,该用户将冻结. 以下内容将 ...

  5. 学妹问我Java枚举类与注解,我直接用这个搞定她!

    很多人问我学妹长什么样,不多说 上图吧! 学妹问我Java枚举类与注解,我直接一篇文章搞定! 一.枚举类 ① 自定义枚举类 ② enum关键字定义枚举类 ③ enum 枚举类的方法 ④ enum 枚举 ...

  6. Java多线程 ——线程基础和锁锁锁

    Java多线程(一) 一.线程的定义 二.Synchronize线程同步 三.偏向锁.自旋锁.重量级锁 四.volatile关键字 4.1.普通变量运算的物理意义 4.2.有无解决的方案 4.3.vo ...

  7. Java多线程系列(七):并发容器的原理,7大并发容器详解、及使用场景

    之前谈过高并发编程系列: 高并发编程系列:4种常用Java线程锁的特点,性能比较.使用场景 高并发编程系列:CountDownLatch.Semaphore等4大并发工具类详解 高并发编程系列:4大J ...

  8. java多线程(分分钟基础秒杀)

    theme: channing-cyan highlight: androidstudio 文章目录 theme: channing-cyan highlight: androidstudio 前言 ...

  9. Java 面试必考难点,这一个教程全搞定

    "用代码行来衡量开发进度,无异于用重量来衡量制造飞机的进度." - Bill Gates 作为当下应用面最广泛的编程语言,Java 已经被广泛应用于几乎所有领域,包括 web 应用 ...

最新文章

  1. 在Web.config或App.config中的添加自定义配置
  2. C语言程序练习- L1-010 比较大小 (10分)
  3. Cannot resolve the collation conflict between SQL_Latin1_General_CP1_CI_AS and Latin1_General_100...
  4. 《Python Cookbook 3rd》笔记(2.19):实现一个简单的递归下降分析器
  5. 浙大计算机学院吴飞,浙江大学吴飞教授来我院作人工智能学术报告
  6. LeetCode Week 1:第 1 ~ 10 题
  7. 内存颗粒和闪存颗粒的区别_国产闪存颗粒终于熬出头 紫光存储S100固态硬盘评测...
  8. 大数据分析需避免哪些错误
  9. 决定明智地放弃对名手旋风等象棋引擎的破解...
  10. 关于CBoard中文查询条件不能正常显示问题?
  11. 中国历代更改重复地名及其现实意义
  12. 小程序分包Error: 分包大小超过限制,main package source
  13. 点云匹配介绍与ICP算法
  14. android的充电线,充电线和数据线的区别
  15. 2022智源大会议程公开 | 人工智能新基建论坛
  16. 2020年计算机夏令营总结
  17. cobbler源码安装
  18. JavaScript对象 1
  19. finalcut剪切快捷键_Final Cut Pro X 常用快捷键大全 FCPX快捷键
  20. linux5关闭apic服务,阐述Linux内核里面的APIC编程

热门文章

  1. Blackhole引擎(黑洞引擎)
  2. 夜神模拟器抓包微信小程序(进入浏览器,弹出安全警告(安全证书有问题解决方法)
  3. MD5 摘要算法应用详解
  4. ThemeBuilder自制主题工具详细使用教程
  5. 从Tlink看企业接入物联网的紧迫性
  6. 通用的支付系统该如何设计?
  7. 大数据时代 “账房先生式”CFO转型迫在眉睫
  8. sendfile函数
  9. colab + cuda
  10. 一文读懂视频编解码原理[通俗易懂]