真⽜⽪!java⾼级程序设计实战教程pdf
为什么要⽤多线程
任何⼀项技术的出现都是为了解决现有问题。
之前的互联⽹⼤多是单机服务,体量⼩;⽽现在的更多是集服务,同⼀时刻有多个⽤户同时访问服务器,那么会有很多线程并发访问。
⽐如在电商系统⾥,同⼀时刻⽐如整点抢购时,⼤量⽤户同时访问服务器,所以现在公司⾥开发的基本都是多线程的。
使⽤多线程确实提⾼了运⾏的效率,但与此同时,我们也需要特别注意数据的增删改情况,这就是线程安全问题,⽐如之前说过的HashMap vs HashTable,Vector 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:那如果物理内存被⽤完了呢?
java编程开发高清pdf
⽤硬盘,⽐如 windows 系统的分页⽂件,就是把⼀部分虚拟内存放到了硬盘上。
相应的,此时程序运⾏会很慢,因为硬盘的读写速度⽐内存慢很多,是我们可以感受到的慢,这就是为什么开多了程序电脑就会变卡的原因。
Q:那这个虚拟内存是有多⼤呢?
对于 64 位操作系统来说,每个程序可以⽤ 64 个⼆进制位,也就是 2^64 这么⼤的空间!
如果还不清楚⼆进制相关内容的,内回复「⼆进制」获取相应的⽂章哦~
总结
总结⼀下,在⼀个时间⽚⾥,⼀个 CPU 只能执⾏⼀个进程。
CPU 给某个进程分配资源后,这个进程开始运⾏;进程⾥的线程去抢占资源,⼀个时间⽚就只有⼀个线程能执⾏,谁先抢到就是谁的。
多进程 vs 多线程
每个进程是独⽴的,进程 A 出问题不会影响到进程 B;
虽然线程也是独⽴运⾏的,但是⼀个进程⾥的线程是共⽤同⼀个堆,如果某个线程 out of memory,那么这个进程⾥所有的线程都完了。所以多进程能够提⾼系统的容错性 fault tolerance ,⽽多线程最⼤的好处就是线程间的通信⾮常⽅便。
进程之间的通信需要借助额外的机制,⽐如进程间通讯 interprocess communication - IPC,或者⽹络传递等等。
知其然不知其所以然,⼤⼚常问⾯试技术如何复习?
1、热门⾯试题及答案⼤全
⾯试前做⾜功夫,让你⾯试成功率提升⼀截,这⾥⼀份热门350道⼀线互联⽹常问⾯试题及答案助你拿offer !诚意满满
2、多线程、⾼并发、缓存⼊门到实战项⽬pdf书籍
3、⽂中提到⾯试题答案整理

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。