a3 u" f8 o+ ^- p i' g* {如果你还不是很理解进程和线程的区别的话,那么我就以我多年操作系统的经验(吹牛逼,实则半年)来为你解释一下:进程是一个应用程序,而线程是应用程序中的一条顺序流。 , x5 [/ T8 `! {; Q7 c6 C! Z- l7 ^6 o& t' F9 X% P9 t3 V3 g
; x- f ^9 W! l. c
" Q4 T/ B' ?0 T( Q; r; {# I: e, l& x5 Y. U
9 z4 e; L. y. W8 o2 }5 a# q8 m
' T2 S+ u' I1 `) X4 X8 j; j/ V ) q3 y& \6 g+ N7 K! l* Q. }- _ l5 j" ]$ @1 t ?- z* V
6 L9 }2 e& A- w3 E" v) G, C+ o2 j- ?2 n
线程会共享进程范围内的资源,例如内存和文件句柄,但是每个线程也有自己私有的内容,比如程序计数器、栈以及局部变量。下面汇总了进程和线程共享资源的区别 $ w$ H8 x. }' P# J P # B0 L* s9 V- t' D2 y: v1 m, b5 G* A5 h- w U: D! C
4 a* C5 d. Y ]' H. k9 c 8 X7 A" J: O( q, d% p% ?$ I 3 T! }' y5 B0 V) E a4 v" G* R5 [3 b& W
线程被描述为一种轻量级的进程,轻量级体现在线程的创建和销毁要比进程的开销小很多。' p* r& W, }: N( z6 e; o }
: I, t! D/ @; Z& K: e5 B; C5 Z% U1 U, B0 w; m8 M. s' f- p
注意:任何比较都是相对的。& Y- W+ H+ o& A7 y' ?4 F( \
) D# A6 m' ^( e4 }; I5 g. l! o) E
2 ]& o2 _4 }) Q3 c
在大多数现代操作系统中,都以线程为基本的调度单位,所以我们的视角着重放在对线程的探究。 : D; D9 W0 Q6 u: j# X/ h5 q+ K. M% S& l) g( `4 H+ I/ N$ \
0 e# a8 i+ B( T k) F" i) o7 \) }
线程 8 {5 ? j' F6 f8 V. V0 S( y. s3 h优势和劣势 8 R d2 F% P3 V B H5 i合理使用线程是一门艺术,合理编写一道准确无误的多线程程序更是一门艺术,如果线程使用得当,能够有效的降低程序的开发和维护成本。 4 o$ d) u. W/ Z) {; F$ g) O$ v0 n0 Z7 i3 v
$ |/ y9 p/ \+ H在 GUI 中,线程可以提高用户界面的响应灵敏度,在服务器应用程序中,并发可以提高资源利用率以及系统吞吐率。) y, y7 v6 A0 h$ z
5 P ]1 H: b5 v- R+ [! @
4 F8 |& t& K% u8 g z
Java 很好的在用户空间实现了开发工具包,并在内核空间提供系统调用来支持多线程编程,Java 支持了丰富的类库 java.util.concurrent 和跨平台的内存模型,同时也提高了开发人员的门槛,并发一直以来是一个高阶的主题,但是现在,并发也成为了主流开发人员的必备素质。 8 {/ a ^8 g. l) i; G & u; |" C& @9 t& s4 ]% h Z+ [6 J - z* x" W& \+ d4 d, k3 i! `虽然线程带来的好处很多,但是编写正确的多线程(并发)程序是一件极困难的事情,并发程序的 Bug 往往会诡异地出现又诡异的消失,在当你认为没有问题的时候它就出现了,难以定位 是并发程序的一个特征,所以在此基础上你需要有扎实的并发基本功。那么,并发为什么会出现呢?% r8 F( W6 c1 U& s8 Z
4 G9 F: I: @5 O0 G$ ]4 ?
, e {4 e; K! C5 ^% l9 Q( H8 ?* L
为什么是并发 & g: j: [: h" d# r2 _* z; `! H计算机世界的快速发展离不开 CPU、内存和 I/O 设备的高速发展,但是这三者一直存在速度差异性问题,我们可以从存储器的层次结构可以看出9 H5 m- h& A8 h* T) r' {
* a2 w: `2 B6 s9 m6 ?' d" Y5 P& S9 U1 o+ L8 [
0 Y5 h2 t _8 l, y2 `* f8 { 3 _! T8 I, n5 Q- a# g$ G. F q: O/ D& \ F# L) m, _$ p# s
! f- m* e. r' @) L/ P" y: P/ v9 W, ^
CPU 内部是寄存器的构造,寄存器的访问速度要高于高速缓存,高速缓存的访问速度要高于内存,最慢的是磁盘访问。 7 x6 e7 o: x) d& @ % H; S. U0 P& d- ~/ Z9 h ( N; d2 J& l$ E程序是在内存中执行的,程序里大部分语句都要访问内存,有些还需要访问 I/O 设备,根据漏桶理论来说,程序整体的性能取决于最慢的操作也就是磁盘访问速度。& i# z+ K+ b2 m N+ o' M7 K( a' \
. ]0 g `" ^$ j* ], | e6 ^( A p7 {" O9 d9 P( M
因为 CPU 速度太快了,所以为了发挥 CPU 的速度优势,平衡这三者的速度差异,计算机体系机构、操作系统、编译程序都做出了贡献,主要体现为:- ?, t" u/ c3 d6 T4 Z- v
* _3 Z4 R; Q7 `. a- b, e
! s6 s) _' u2 p3 r) {CPU 使用缓存来中和和内存的访问速度差异: L2 S$ Y7 j3 l0 H* a% G
操作系统提供进程和线程调度,让 CPU 在执行指令的同时分时复用线程,让内存和磁盘不断交互,不同的 CPU 时间片 能够执行不同的任务,从而均衡这三者的差异 $ |7 v. f# R* {编译程序提供优化指令的执行顺序,让缓存能够合理的使用 , R& E3 T+ |5 U1 O- u. H' E4 e; t我们在享受这些便利的同时,多线程也为我们带来了挑战,下面我们就来探讨一下并发问题为什么会出现以及多线程的源头是什么 , `( `/ ^0 A A x+ ^# C9 ^& {9 I+ {$ R! h* \+ P! e7 y- L
总结 2 J1 ^+ y8 c* M# O( }+ I我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。6 z, Q0 Q9 p1 [! ~4 ?