《Java并发编程实战》读书笔记一 -- 简介

并发的历史

并发的历史,也是人类利用有限的资源去提高生产效率的一个的例子。

设想现在有台计算机,这台计算机具有以下的资源:

  • 单核CPU一个
  • 内存
  • 磁盘
  • 打印机

就跟下图所示:


一台简要的计算机

很久以前(也没多久,几十年前),计算机只能跑一个程序(可以回想下初学51时候的点灯程序)。这个时候程序是非常的自由的,因为他可以占用整个计算机的所有的资源。如下所示:


点灯程序占用了所有的资源

往往有些程序很贱,明明占用着很多的资源,但是却不好好利用,上图的“点灯程序”就是这样一个例子,他只用偶尔用用IO。人们很快就发现了问题,资源浪费太严重了。用我们中国人的话说就是:占着茅坑不拉屎。

所以,计算机学家们想了一个办法:我不能让一个程序占据了所有的计算机资源,为什么我不写一个程序管理所有的计算机资源,然后其他程序需要使用资源的时候,向这个程序申请资源呢?

在这种思想的指引下,操作系统出现了。操作系统管理着计算机软件以及硬件的所有资源。这个时候,就跟下面一样了:


操作系统分配系统资源

程序需要使用什么资源,向操作系统提出申请,由操作系统统一的进行分配(具体怎么分配,这是个非常高深的学问了)。这样做的好处十分的明显:

  1. 提高了资源的利用率

    例如,程序A在执行的过程中需要等待用户的输入,那么操作系统可以分配一部分程序A不用的资源给程序B使用。

  2. 公平性

    所有的程序都能访问计算机的资源,并不会再次的出现上面的“点灯程序”占用了所有的资源不干活的情况了。

  3. 用户体验

    可以允许多个程序同时的运行,意味着用户体验的提升。以前你只能听完歌以后去浏览网页,现在你可以边听歌边浏览网页,这就是操作系统在底下帮你分配资源的结果。而“同时运行”(注意:这里其实不是同时运行,程序之间切换的时间极短,人类感觉不出来)多个程序,也就是所谓的“并发”。

现在我们为“程序”这个概念换一个名字,因为实际上,程序是一个静态的概念,指的是我们编写的代码。但是跑在计算机里面的程序可不是静态的,称之为“进程”,接下来都会使用“进程”而不是“程序”了。

万事大吉了吗?没有!

假设程序C在某个时刻真的获取到了所有的资源,还是会存在上述的问题:虽然现在是分配资源的形式,不是独占资源的形式,但是每个任务要求的使用的资源还是不一样的,这就导致了资源还是会存在空闲的情况--资源利用率还是不够高(我们希望计算机尽量的忙起来,榨干他)!

假设程序C有以下几个任务:

  • 任务A:需要使用CPU
  • 任务B:需要使用内存
  • 任务C:需要使用磁盘

这个时候,一个进程只能执行一个子任务,那么在执行任务A的时候,除了CPU以外的资源又被浪费了。同理,任务B、任务C也是一样。

聪明的计算机学家一样发现了这个问题,因此,线程出现了。每个线程都独立的运行,都共享着进程的资源(CPU、内存、磁盘等等)。这样,在某个时刻,计算机可能是这样的:


执行进程C

线程A执行任务A的时候,线程B去执行任务B,而线程去执行任务C -- 这样在同一个时刻,系统的资源都得到了充分的利用。

其实,操作系统分配的资源,也是一个个小小的冯诺依曼计算机,在这个角度上理解,是不是就好理解了呢~

进程与线程

概念定义

进程

In computing, a process is an instance of a computer program that is being executed. It contains the program code and its current activity. Depending on the operating system (OS), a process may be made up of multiple threads of execution that execute instructions concurrently.

线程

In computer science, a thread of execution is the smallest sequence of programmed instructions that can be managed independently by a scheduler, which is typically a part of the operating system.

以上的定义均来自维基百科,其实按照我的理解:

1、 进程是操作系统进行资源分配的最小单位;

2、 线程是CPU最小的执行单元。

区分进程以及线程概念的区别,只要记住一点就够了:进程是不共享内存的,线程是共享内存的。就是因为线程共享了内存,才会导致到多线程编程的复杂性。其余的区别,可以参考网上的其他资料,这里就不赘述了。

线程

线程的优点

采用多线程的优点比较多,大致有以下几点:

  • 提高了资源的利用率
  • 更加简单的程序设计
  • 对用户更友好的响应

但是最明显的优点就是:提高了资源的利用率

一个十分简单的例子就是IO操作,在单线程中的读取文件如下所示:

  5 seconds reading file A
2 seconds processing file A
5 seconds reading file B
2 seconds processing file B
-----------------------
14 seconds total

在读取文件的这段时间里,CPU是空闲的,却没有使用CPU。但是,如果使用了多线程,就可以变成以下这个样子:

  5 seconds reading file A
5 seconds reading file B + 2 seconds processing file A
2 seconds processing file B
-----------------------
12 seconds total

这样就可以在读取文件B的同时,CPU处理文件A了,提升了资源的利用率,节省了总的时间。

线程的缺点

个人认为,多线程的缺点十分的明显:由于存在了共享,那么如何使得共享的数据同步是一项非常复杂的工作(这也是我看这本书的原因)。

接下来的时间里面,我会继续阅读这本书,但是说句实话,此书翻译确实不咋滴,还不如看原文。

总结

复习一下,本文主要讲了以下内容:

  • 进程、线程的发展历史
  • 操作系统
    • 系统资源分配的算法
  • 线程的优点、缺点

    每一块内容都可以深入的了解,读者可以挑自己感兴趣的内容自己去深入~

《Java并发编程实战》读书笔记一 -- 简介的更多相关文章

  1. Java并发编程实战 读书笔记(一)

    最近在看多线程经典书籍Java并发变成实战,很多概念有疑惑,虽然工作中很少用到多线程,但觉得还是自己太弱了.加油.记一些随笔.下面简单介绍一下线程. 一  线程与进程   进程与线程的解释   个人觉 ...

  2. Java并发编程实战 读书笔记(二)

    关于发布和逸出 并发编程实践中,this引用逃逸("this"escape)是指对象还没有构造完成,它的this引用就被发布出去了.这是危及到线程安全的,因为其他线程有可能通过这个 ...

  3. 《java并发编程实战》笔记

    <java并发编程实战>这本书配合并发编程网中的并发系列文章一起看,效果会好很多. 并发系列的文章链接为:  Java并发性和多线程介绍目录 建议: <java并发编程实战>第 ...

  4. Java多线程编程实战读书笔记(一)

    多线程的基础概念本人在学习多线程的时候发现一本书——java多线程编程实战指南.整理了一下书中的概念制作成了思维导图的形式.按照书中的章节整理,并添加一些个人的理解.

  5. Java并发编程实践读书笔记(5) 线程池的使用

    Executor与Task的耦合性 1,除非线程池很非常大,否则一个Task不要依赖同一个线程服务中的另外一个Task,因为这样容易造成死锁: 2,线程的执行是并行的,所以在设计Task的时候要考虑到 ...

  6. Java并发编程艺术读书笔记

    1.多线程在CPU切换过程中,由于需要保存线程之前状态和加载新线程状态,成为上下文切换,上下文切换会造成消耗系统内存.所以,可合理控制线程数量. 如何控制: (1)使用ps -ef|grep appn ...

  7. Java并发编程实践(读书笔记) 任务执行(未完)

    任务的定义 大多数并发程序都是围绕任务进行管理的.任务就是抽象和离散的工作单元.   任务的执行策略 1.顺序的执行任务 这种策略的特点是一般只有按顺序处理到来的任务.一次只能处理一个任务,后来其它任 ...

  8. Java并发编程实践读书笔记(2)多线程基础组件

    同步容器 同步容器是指那些对所有的操作都进行加锁(synchronize)的容器.比如Vector.HashTable和Collections.synchronizedXXX返回系列对象: 可以看到, ...

  9. Java并发编程实践读书笔记(1)线程安全性和对象的共享

    2.线程的安全性 2.1什么是线程安全 在多个线程访问的时候,程序还能"正确",那就是线程安全的. 无状态(可以理解为没有字段的类)的对象一定是线程安全的. 2.2 原子性 典型的 ...

  10. 《Java并发编程实战》笔记-非阻塞算法

    如果在某种算法中,一个线程的失败或挂起不会导致其他线程也失败和挂起,那么这种算法就被称为非阻塞算法.如果在算法的每个步骤中都存在某个线程能够执行下去,那么这种算法也被称为无锁(Lock-Free)算法 ...

随机推荐

  1. 优化MyEclipse编译速度慢的问题

    转载大神的 https://www.cnblogs.com/luxd/p/5999217.html

  2. Net Core 2.0生态1

    Net Core 2.0生态 阅读目录 前言:答读者问(time by:2017.8.19) 项目升级到ASP.NET Core 2.0 新增功能:Razor Pages介绍 模板更新 Entity ...

  3. 博弈论 && 题目

    终于我也开始学博弈了,说了几个月,现在才学.学多点套路,不深学.(~~) 参考刘汝佳蓝书p132 nim游戏: 假设是两维的取石子游戏,每次可以在任意一堆拿任意数量个(至少一根,因为这样游戏的状态集有 ...

  4. pom文件jar包缺失问题

    一般情况,不在中央仓库的jar包,比如自己的版本,要用的话打入maven私服 在eclipse中引入其他项目(包含jar包),类似于放入了私服,删除工程源文件,会导致别的工程引用此jar包失效

  5. [luogu 2634]聪聪可可

    题目描述 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好了,可是他们已 ...

  6. java构造方法之我见

    java中构造方法是作为除了成员方法之外的一种特殊方法,方法名与类名相同.一般类中如果没有明确定义构造方法时,编译器默认为无参构造方法.当我们调用new方法创建对象就是通过构造方法完成的.因此,当有对 ...

  7. 终于有人把P2P、P2C、O2O、B2C、B2B、C2C的区别讲透了!还有许多其它类别的类型分享

    平时在看招聘时,经常看到我们是什么B2C电子商务网站,但是一直不知是啥意思,今天在WEB开发者上面看到这篇文章,就是知道了个所以然,以记录分享. P2P.P2C .O2O .B2C.B2B. C2C, ...

  8. CDN加速服务

    CDN公共库是指将常用的JS库存放在CDN节点,以方便广大开发者直接调用.与将JS库存放在服务器单机上相比,CDN公共库更加稳定.高速.一般的CDN公共库都会包含全球所有最流行的开源JavaScrip ...

  9. volley框架下发送和读取cookie

    首先volley本身不支持cookie,但是volley又非常好用(比如封装了网络请求的实现,内部支持并发, 不用我们再额外设计网络管理异步处理,网络请求不应在UI线程等等),那既想使用volley又 ...

  10. jQuery动态追加移除CSS样式

    jQuery基础知识,动态添加删除CSS样式 <!DOCTYPE html> <html lang="en"> <head> <meta ...