《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并发编程实践》学习笔记之一:基础知识相关推荐

  1. java并发编程实战学习笔记之基础知识与对象的共享

    第二章:线程安全性 2.1 什么是线程安全性 可以被多个线程调用,并且在线程之间不会出现错误的交互 方法内的局部变量不需要保护,因为它存储在栈中,是每个线程独有的 2.2 原子性 一个共享变量可以定义 ...

  2. Java并发编程艺术学习笔记(五)

    Java并发编程艺术学习笔记(五) Java并发容器和框架 Java为开发者也提供了许多开发容器和框架,可以从每节的原理分析来学习其中精妙的并发程序. 一.ConcurrentHashMap的实现原理 ...

  3. 极客时间《Java并发编程》学习笔记

      该领域是跟着"极客时间"平台的课程<Java并发编程>入门的,讲师是王宝令.说实话,这个领域如果抱着大部头的书就啃的话,由于缺少实践很难会建立一个体系,即不知道为什 ...

  4. java并发编程实践 读书笔记_Java - 并发编程实践(读书笔记)

    [注] 同步机制保证:1)原子性 2)内存可见性: Volatile变量只能保证:1)可见性: - 恰当的同步,同步的弱形式,确保对一个变量的更新以可预见的方式告知其他线程. [注] 用锁来协调访问变 ...

  5. 《UNIX 环境高级编程》学习笔记——UNIX 基础知识

    UNIX环境高级编程--UNIX 基础知识 引言 UNIX 体系结构 登录 文件和目录 输入和输出 程序和进程 出错处理 用户标识 信号 时间值 系统调用和库函数 引言 所有操作系统都为它们所允许的程 ...

  6. Java 并发编程实践 读书笔记四

    组合对象 设计线程安全的类 设计线程安全类的过程应该包括下面3个基本要素: 确定对象状态是由哪些变量构成的 确定限制状态变量的不变约束 制定一个管理并发访问对象状态的策略 对象状态从域讲,如果对象域都 ...

  7. 《java并发编程实践》笔记

    为什么80%的码农都做不了架构师?>>>    1.获取java对象内部锁的唯一路径:进入这个内部锁保护的同步块或同步方法. 转载于:https://my.oschina.net/e ...

  8. 《Java并发编程实践》笔记6——并发性调优

    1.Amdahl定律: Amdahl(阿姆达尔)定律描述了在一个系统中,基于可并行化和串行化的组件各自所占的比重,程序通过获得额外的计算资源,理论上能够加速多少.若F是必须串行化执行的比重,那么在一个 ...

  9. Java并发编程实践读书笔记(3)任务执行

    类似于Web服务器这种多任务情况时,不可能只用一个线程来对外提供服务.这样效率和吞吐量都太低. 但是也不能来一个请求就创建一个线程,因为创建线程的成本很高,系统能创建的线程数量是有限的. 于是Exec ...

  10. JAVA并发编程实践笔记

    2019独角兽企业重金招聘Python工程师标准>>> JAVA并发编程实践笔记 博客分类: java JAVA并发编程实践笔记 1, 保证线程安全的三种方法:     a, 不要跨 ...

最新文章

  1. linux睡眠当前进程,linux-0.11中进程睡眠函数sleep_on()解析
  2. linux ssh 报错 Failed to start OpenSSH Server daemon
  3. sublimelinter校验php,代码校验工具 SublimeLinter 的安装与使用
  4. c语言五子棋开题报告,基于VC的五子棋游戏的设计与实现(附答辩记录)
  5. python语言中with as的用法使用详解
  6. C#对window 硬件类操作,ManagementObjectSearcher
  7. 【漫画】25岁程序员 VS 35岁程序员,塑造自己的不可替代性,才能让自己更有价值 ​...
  8. Vue封装下拉框组件时,为document绑定原生事件addEventlistener(click“),切换页面之后事件还未被摧毁...
  9. 电路板上的插头怎么拔下来_空调插头一直不拔费电吗?实测一周竟然发现了真相!...
  10. bootstrap 滚动 进度条_bootstrap实现动态进度条效果
  11. 操作mysql_MySQL 事务操作
  12. C#中的深度学习:使用OpenCV进行硬币检测
  13. web开发模式+三层架构与MVC
  14. 算法学习笔记(六) 二叉树和图遍历—深搜 DFS 与广搜 BFS
  15. 【POJ 3977】【折半枚举】【超大背包】Subset【暑期 No.7】
  16. 数据可视化案例(六)——智慧医院数据可视化
  17. gateway和nginx网关的区别
  18. 头条号想过新手,但指数却一直达不到650,该怎么过新手?
  19. Android获取本机蓝牙地址
  20. 到底要学前端还是后端?

热门文章

  1. 【线下首场免费报名啦】阿里云2020云内存数据库峰会 年度开发者的盛宴
  2. Rancher 推出 k3OS,业界首个 Kubernetes 操作系统
  3. Windows下Python 3.7.1安装
  4. 大数据工作的正确打开姿势
  5. 新报告直指3大安全威胁 企业需小心应对
  6. 标准化工作取得新突破 窄带物联网商用指日可待
  7. 数据挖掘导论读书笔记5关联分析的基本概念和算法
  8. 给妹子讲python-S01E18初探函数作用域
  9. 利用卷积神经网络(VGG19)实现火灾分类(附tensorflow代码及训练集)
  10. ES _source字段介绍——json文档,去掉的话无法更新部分文档,最重要的是无法reindex...