《Java并发编程实践》学习笔记之一:基础知识
《Java并发编程实践》学习笔记之一:基础知识
1、程序与进程
1.1 程序与进程的概念
(1)程序:一组有序的静态指令,是一种静态概念;
(2)进程:是一种活动,它是由一个动作序列组成,每个动作是在某个数据集上执行一段程序,整个活动的结果是提供一种系统或用户功能。
1.2 进程与程序的区别
(1)进程是程序的一次运行活动,属于一种动态的概念。进程是执行程序的动态过程,而程序是进程运行的静态文本。
(2)一个进程可以执行一个或多个程序。当然,同一程序也可能由多个进程同时执行。
(3)程序可以作为一种软件资源长期保存着,而进程则是一次执行过程。
1.3 进程的结构
在 UNIX 或者 Linux 中, 进程是通过 FORK 系统调用被创建的。 在调用了 FORK 之后,父进程可以和子进程并行。父进程还可以创建多个子进程,也就是说,在同一时刻,一个父进程可以有多个正在运行的子进程。子进程也可以执行 FORK 调用。这样就可以在系统中生成一个进程树。
进程通常由三部分组成。一部分是程序,一部分数据集合,另一部分被称为进程控制块(ProcessControlBlock,简记PCB)。
进程的程序部分描述了进程所要完成的功能。数据集合部分则有两方面的内容,即程序运行时所需要的数据部分和工作区。如果一个程序能为多个进程同时共享执行,它是进程执行时不可修改的部分。而数据集合部分则通常为一个进程独占,为进程的可修改部分。程序和数据集合是进程存在的物质基础,是进程的实体。
进程控制块有时也称为进程描述块,它包含了进程的描述信息和控制信息,是进程动态特性的集中反映。
总之, 每个进程基本上有自己独立的代码和数据空间, 独立的程序计数器等上下文环境,进程切换的开销是比较大的。
2、线程
进程具备并发性的特点,这种并发性是不同的进程之间反映出来的,不同的进程有不同进程空间,进程之间的切换消耗比较大。那么就考虑到引入线程的概念,在进程的内部引入并发性,一个进程可以创建多个线程,线程之间具备并发性。不同的线程之间可以共享进程的地址空间和数据。
一般的讲, 线程是一个程序, 或者进程内部的一个顺序控制流。 线程本身不能独立运行,必须在进程中执行,使用进程的地址空间。每个线程有自己单独的程序计数器。
2.1 多线程的优势(相比多进程)
创建进程的高消耗(每个进程都有独立的数据和代码空间),进程之间通信的不方便(消息机制),进程切换的时间太长。
然而线程的切换也是需要时间的。对于单CPU,采用多线程不会提高程序的执行速度,反而会降低速度,但是对于用户来说,可以减少用户的响应时间。而对于多CPU或者 CPU 采用超线程技术的话,采用多线程技术还是会提高程序的执行速度的。
进程内的同一类线程可以共享代码和数据空间,每个线程有独立的运行栈和程序计数器,切换的开销比较小,灵活性高。在支持超线程和多核的 CPU 上,多线程能够并发或者并行执行,可以在同一时间段内完成不同的任务,或者加快程序的执行。同一进程内的多个线程,调度比较灵活,可以相互协调和协作共同完成特定任务。
2.2 Java创建多线程
Java 定义了一个线程的概念模型,把一个线程分为三部分:虚拟 CPU(java.lang.Thread类),虚拟 CPU执行的代码和数据。创建一个Thread对象就意味着创建了一个线程。
创建线程的方法就总结了,可以参考Polaris的《第一篇 多线程的使用——Thread类和Runnable接口》。
根据Java线程的概念模型,继承Thread方式会将虚拟CPU和代码混合在一起,而Runnable方式将它们分开。
2.3 线程池
线程有时称为轻量级进程。与进程一样,它们拥有通过程序运行的独立的并发路径,并且每个线程都有自己的程序计数器,称为堆栈和本地变量。然而,线程存在于进程中,它们与同一进程内的其他线程共享内存、文件句柄以及每进程状态。
创建线程会使用相当一部分内存,其中包括有堆栈,以及每线程数据结构。如果创建过多线程,其中每个线程都将占用一些 CPU 时间,结果将使用许多内存来支持大量线程,每个线程都运行得很慢。这样就无法很好地使用计算资源。
可喜的是,Java自从 5.0以来,提供了线程池。线程的目标执行对象可以共享线程池中有限数目的线程对象。
一切的服务器都需要线程池,比如Web、FTP等服务器。
2.3.1 使用线程池
使用JDK提供的线程池一般分为3步:1)创建线程目标对象,可以多个;2)使用 Executors 创建线程池, 返回一个ExecutorService类型的对象;3)使用线程池执行线程目标对象,exec.execute(run),最后,结束线程池中的线程,exec.shutdown()。
3、总结
以上大部分知识点在后面的章节会详细介绍。
注:写完这些后,阅读英文原版,发现第一章不是这些内容,这一章似乎是中文翻译者加上去的,又或者是网络上谁流传的。不过竟然笔记写好了,也就留下来,毕竟讲得也不错。
本文转自polaris1119 51CTO博客,原文链接:http://blog.51cto.com/polaris/380814,如需转载请自行联系原作者
《Java并发编程实践》学习笔记之一:基础知识相关推荐
- java并发编程实战学习笔记之基础知识与对象的共享
第二章:线程安全性 2.1 什么是线程安全性 可以被多个线程调用,并且在线程之间不会出现错误的交互 方法内的局部变量不需要保护,因为它存储在栈中,是每个线程独有的 2.2 原子性 一个共享变量可以定义 ...
- Java并发编程艺术学习笔记(五)
Java并发编程艺术学习笔记(五) Java并发容器和框架 Java为开发者也提供了许多开发容器和框架,可以从每节的原理分析来学习其中精妙的并发程序. 一.ConcurrentHashMap的实现原理 ...
- 极客时间《Java并发编程》学习笔记
该领域是跟着"极客时间"平台的课程<Java并发编程>入门的,讲师是王宝令.说实话,这个领域如果抱着大部头的书就啃的话,由于缺少实践很难会建立一个体系,即不知道为什 ...
- java并发编程实践 读书笔记_Java - 并发编程实践(读书笔记)
[注] 同步机制保证:1)原子性 2)内存可见性: Volatile变量只能保证:1)可见性: - 恰当的同步,同步的弱形式,确保对一个变量的更新以可预见的方式告知其他线程. [注] 用锁来协调访问变 ...
- 《UNIX 环境高级编程》学习笔记——UNIX 基础知识
UNIX环境高级编程--UNIX 基础知识 引言 UNIX 体系结构 登录 文件和目录 输入和输出 程序和进程 出错处理 用户标识 信号 时间值 系统调用和库函数 引言 所有操作系统都为它们所允许的程 ...
- Java 并发编程实践 读书笔记四
组合对象 设计线程安全的类 设计线程安全类的过程应该包括下面3个基本要素: 确定对象状态是由哪些变量构成的 确定限制状态变量的不变约束 制定一个管理并发访问对象状态的策略 对象状态从域讲,如果对象域都 ...
- 《java并发编程实践》笔记
为什么80%的码农都做不了架构师?>>> 1.获取java对象内部锁的唯一路径:进入这个内部锁保护的同步块或同步方法. 转载于:https://my.oschina.net/e ...
- 《Java并发编程实践》笔记6——并发性调优
1.Amdahl定律: Amdahl(阿姆达尔)定律描述了在一个系统中,基于可并行化和串行化的组件各自所占的比重,程序通过获得额外的计算资源,理论上能够加速多少.若F是必须串行化执行的比重,那么在一个 ...
- Java并发编程实践读书笔记(3)任务执行
类似于Web服务器这种多任务情况时,不可能只用一个线程来对外提供服务.这样效率和吞吐量都太低. 但是也不能来一个请求就创建一个线程,因为创建线程的成本很高,系统能创建的线程数量是有限的. 于是Exec ...
- JAVA并发编程实践笔记
2019独角兽企业重金招聘Python工程师标准>>> JAVA并发编程实践笔记 博客分类: java JAVA并发编程实践笔记 1, 保证线程安全的三种方法: a, 不要跨 ...
最新文章
- linux睡眠当前进程,linux-0.11中进程睡眠函数sleep_on()解析
- linux ssh 报错 Failed to start OpenSSH Server daemon
- sublimelinter校验php,代码校验工具 SublimeLinter 的安装与使用
- c语言五子棋开题报告,基于VC的五子棋游戏的设计与实现(附答辩记录)
- python语言中with as的用法使用详解
- C#对window 硬件类操作,ManagementObjectSearcher
- 【漫画】25岁程序员 VS 35岁程序员,塑造自己的不可替代性,才能让自己更有价值 ​...
- Vue封装下拉框组件时,为document绑定原生事件addEventlistener(click“),切换页面之后事件还未被摧毁...
- 电路板上的插头怎么拔下来_空调插头一直不拔费电吗?实测一周竟然发现了真相!...
- bootstrap 滚动 进度条_bootstrap实现动态进度条效果
- 操作mysql_MySQL 事务操作
- C#中的深度学习:使用OpenCV进行硬币检测
- web开发模式+三层架构与MVC
- 算法学习笔记(六) 二叉树和图遍历—深搜 DFS 与广搜 BFS
- 【POJ 3977】【折半枚举】【超大背包】Subset【暑期 No.7】
- 数据可视化案例(六)——智慧医院数据可视化
- gateway和nginx网关的区别
- 头条号想过新手,但指数却一直达不到650,该怎么过新手?
- Android获取本机蓝牙地址
- 到底要学前端还是后端?
热门文章
- 【线下首场免费报名啦】阿里云2020云内存数据库峰会 年度开发者的盛宴
- Rancher 推出 k3OS,业界首个 Kubernetes 操作系统
- Windows下Python 3.7.1安装
- 大数据工作的正确打开姿势
- 新报告直指3大安全威胁 企业需小心应对
- 标准化工作取得新突破 窄带物联网商用指日可待
- 数据挖掘导论读书笔记5关联分析的基本概念和算法
- 给妹子讲python-S01E18初探函数作用域
- 利用卷积神经网络(VGG19)实现火灾分类(附tensorflow代码及训练集)
- ES _source字段介绍——json文档,去掉的话无法更新部分文档,最重要的是无法reindex...