• 文章介绍
  • 评价建议

  • ⽬录

    1. RedSpider社区简介
    2. 本书作者介绍
    3. 本书简介
    4. 第⼀篇:基础篇
    5. 1 进程与线程基本概念
    6. 2 Java多线程⼊⻔类和接⼝
    7. 3 线程组和线程优先级
    8. 4 Java线程的状态及主要转化⽅法
    9. 5 Java线程间的通信
    10. 第⼆篇:原理篇
    11. 6 Java内存模型基础知识
    12. 7 重排序与happens-before
    13. 8 volatile
    14. 9 synchronized与锁
    15. 10 CAS与原⼦操作
    16. 11 AQS
    17. 第三篇:JDK⼯具篇
    18. 12 线程池原理
    19. 13 阻塞队列
    20. 14 锁接⼝和类
    21. 15 并发集合容器简介
    22. 16 CopyOnWrite
    23. 17 通信⼯具类
    24. 18 Fork/Join框架
    25. 19 Java 8 Stream并⾏计算原理
    26. 20 计划任务

    第一章预览

    1.1 进程产⽣的背景

    最初的计算机只能接受⼀些特定的指令,⽤户每输⼊⼀个指令,计算机就做出⼀个操作。当⽤户在思考或者输⼊时,计算机就在等待。这样效率⾮常低下,在很多时候,计算机都处在等待状态。

    批处理操作系统

    后来有了批处理操作系统,把⼀系列需要操作的指令写下来,形成⼀个清单,⼀次性交给计算机。⽤户将多个需要执⾏的程序写在磁带上,然后交由计算机去读取并逐个执⾏这些程序,并将输出结果写在另⼀个磁带上。批处理操作系统在⼀定程度上提⾼了计算机的效率,但是由于批处理操作系统的指令运⾏⽅式仍然是串⾏的,内存中始终只有⼀个程序在运⾏,后⾯的程序需要等待前⾯的程序执⾏完成后才能开始执⾏,⽽前⾯的程序有时会由于I/O操作、⽹络等原因阻塞,所以批处理操作效率也不⾼。

    进程的提出

    ⼈们对于计算机的性能要求越来越⾼,现有的批处理操作系统并不能满⾜⼈们的需求,⽽批处理操作系统的瓶颈在于内存中只存在⼀个程序,那么内存中能不能存在多个程序呢?这是⼈们亟待解决的问题。于是,科学家们提出了进程的概念。进程就是应⽤程序在内存中分配的空间,也就是正在运⾏的程序,各个进程之间互不⼲扰。同时进程保存着程序每⼀个时刻运⾏的状态。

    程序:⽤某种编程语⾔(java、python等)编写,能够完成⼀定任务或者功能的代码集合,是指令和数据的有序集合,是⼀段静态代码。此时,CPU采⽤时间⽚轮转的⽅式运⾏进程:CPU为每个进程分配⼀个时间段,称作它的时间⽚。如果在时间⽚结束时进程还在运⾏,则暂停这个进程的运⾏,并且CPU分配给另⼀个进程(这个过程叫做上下⽂切换)。如果进程在时间⽚结束前阻塞或结束,则CPU⽴即进⾏切换,不⽤等待时间⽚⽤完。当进程暂停时,它会保存当前进程的状态(进程标识,进程使⽤的资源等),在下⼀次切换回来时根据之前保存的状态进⾏恢复,接着继续执⾏。使⽤进程+CPU时间⽚轮转⽅式的操作系统,在宏观上看起来同⼀时间段执⾏多个任务,换句话说,进程让操作系统的并发成为了可能。虽然并发从宏观上看有多个任务在执⾏,但在事实上,对于单核CPU来说,任意具体时刻都只有⼀个任务在占⽤CPU资源。对操作系统的要求进⼀步提⾼

    1   进程与线程基本概念

    虽然进程的出现,使得操作系统的性能⼤⼤提升,但是随着时间的推移,⼈们并不满⾜⼀个进程在⼀段时间只能做⼀件事情,如果⼀个进程有多个⼦任务时,只能逐个得执⾏这些⼦任务,很影响效率。⽐如杀毒软件在检测⽤户电脑时,如果在某⼀项检测中卡住了,那么后⾯的检测项也会受到影响。或者说当你使⽤杀毒软件中的扫描病毒功能时,在扫描病毒结束之前,⽆法使⽤杀毒软件中清理垃圾的功能,这显然⽆法满⾜⼈们的要求。

    线程的提出

    那么能不能让这些⼦任务同时执⾏呢?于是⼈们⼜提出了线程的概念,让⼀个线程执⾏⼀个⼦任务,这样⼀个进程就包含了多个线程,每个线程负责⼀个单独的⼦任务。

    使⽤线程之后,事情就变得简单多了。当⽤户使⽤扫描病毒功能时,就让扫描病毒这个线程去执⾏。同时,如果⽤户⼜使⽤清理垃圾功能,那么可以先暂停扫描病毒线程,先响应⽤户的清理垃圾的操作,让清理垃圾这个线程去执⾏。响应完后再切换回来,接着执⾏扫描病毒线程。

    注意:操作系统是如何分配时间⽚给每⼀个线程的,涉及到线程的调度策略,有兴趣的同学可以看⼀下《操作系统》,本⽂不做深⼊详解。

    总之,进程和线程的提出极⼤的提⾼了操作提供的性能。进程让操作系统的并发性成为了可能,⽽线程让进程的内部并发成为了可能。

    多进程的⽅式也可以实现并发,为什么我们要使⽤多线程?

    多进程⽅式确实可以实现并发,但使⽤多线程,有以下⼏个好处:进程间的通信⽐较复杂,⽽线程间的通信⽐较简单,通常情况下,我们需要使⽤共享资源,这些资源在线程间的通信⽐较容易。进程是重量级的,⽽线程是轻量级的,故多线程⽅式的系统开销更⼩。

    进程和线程的区别

    进程是⼀个独⽴的运⾏环境,⽽线程是在进程中执⾏的⼀个任务。他们两个本质的区别是是否单独占有内存地址空间及其它系统资源(⽐如I/O):进程单独占有⼀定的内存地址空间,所以进程间存在内存隔离,数据是分开的,数据共享复杂但是同步简单,各个进程之间互不⼲扰;⽽线程共享所属进程占有的内存地址空间和资源,数据共享简单,但是同步复杂。进程单独占有⼀定的内存地址空间,⼀个进程出现问题不会影响其他进程,不影响主程序的稳定性,可靠性⾼;⼀个线程崩溃可能影响整个程序的稳定性,可靠性较低。

    进程单独占有⼀定的内存地址空间,进程的创建和销毁不仅需要保存寄存器和栈信息,还需要资源的分配回收以及⻚调度,开销较⼤;线程只需要保存寄存器和栈信息,开销较⼩。另外⼀个重要区别是,进程是操作系统进⾏资源分配的基本单位,⽽线程是操作系统进⾏调度的基本单位,即CPU分配时间的单位 。

    免责声明:
    1. 本站资源转自互联网,源码资源分享仅供交流学习,下载后切勿用于商业用途,否则开发者追究责任与本站无关!
    2. 本站使用「署名 4.0 国际」创作协议,可自由转载、引用,但需署名原版权作者且注明文章出处
    3. 未登录无法下载,登录使用金币下载所有资源。
    IT小站 » 阿里大神内部版Java并发编程原理(PDF原版高清)

    常见问题FAQ

    没有金币/金币不足 怎么办?
    本站已开通每日签到送金币,每日签到赠送五枚金币,金币可累积。
    所有资源普通会员都能下载吗?
    本站所有资源普通会员都可以下载,需要消耗金币下载的白金会员资源,通过每日签到,即可获取免费金币,金币可累积使用。

    发表评论