《Java并发编程实战》读书笔记-第1章 简介
并发简史
在早期的计算机中不包含操作系统,从头至尾都只执行一个程序,并且这个程序能访问计算机所有资源。操作系统的出现使得计算机每次能运行多个程序,并且不同的程序都在单独的进程中运行:操作系统为各个独立执行的进程分配内存、文件句柄、安全证书等。不同进程之间通过一些粗粒度的通信机制交换数据,包括:套接字、信号处理器、共享内存、信号量以及文件等。
之所以在计算机中加入操作系统来实现多个程序同时执行,主要基于以下原因:
资源利用率:在某些情况下,程序如果在等待某个外部操作执行完成的同时,可以运行另一个程序,那无疑将提高资源的利用率。
公平性:通过粗粒度的时间分片运行方式,使得不同的用户和程序对于计算机上的资源有着共同的使用权。
便利性:计算多个任务时,编写多个程序,每个程序执行一个任务并在必要时相互通信,比之编写一个程序来计算所有任务更容易实现。
这些促使进程出现的因素同样也促使着线程的出现。线程允许同一个进程中同时存在多个程序控制流。线程会共享进程范围内的资源(内存、文件句柄),但每个线程都有各自的程序计数器、栈、局部变量等。一个程序中的多个线程也可以同时被调度到多个CPU上运行。
线程也被称为轻量级进程。现代操作系统中,都是以线程为基本的调度单位,而不是进程。
线程的优势
发挥多处理器的强大能力
建模的简单性
异步事件的简化处理
响应更灵敏的用户界面
线程带来的风险
安全性问题
多个线程同时访问和修改相同的变量时,会发生无法预料的数据变化,导致线程出现错误
活跃性问题
当某个操作无法继续执行下去时:死锁、饥饿、活锁
性能问题
多线程程序中不仅存在于单线程程序相同的性能问题(服务时间过长、响应不灵敏、吞吐率过低、资源消耗过高、可伸缩行较低等),而且还存在由于使用线程而引入的其他性能问题:
- 在多线程程序中,当线程调度器临时挂起活跃线程并转而运行另一个线程时,会频繁的出现上下文切换操作(Context
Switch),这种操作将带来极大的开销:保存和恢复执行上下文,丢失局部性,CPU花更多的时间在线程调度而不是线程运行上。 - 使用同步机制操作共享数据时,会抑制编译器优化,是内存缓存区中的数据无效,以及增加共享内存总线的同步流量
《Java并发编程实战》读书笔记-第1章 简介的更多相关文章
- Java并发编程实战 读书笔记(一)
最近在看多线程经典书籍Java并发变成实战,很多概念有疑惑,虽然工作中很少用到多线程,但觉得还是自己太弱了.加油.记一些随笔.下面简单介绍一下线程. 一 线程与进程 进程与线程的解释 个人觉 ...
- Java并发编程实战 读书笔记(二)
关于发布和逸出 并发编程实践中,this引用逃逸("this"escape)是指对象还没有构造完成,它的this引用就被发布出去了.这是危及到线程安全的,因为其他线程有可能通过这个 ...
- 《java并发编程实战》笔记
<java并发编程实战>这本书配合并发编程网中的并发系列文章一起看,效果会好很多. 并发系列的文章链接为: Java并发性和多线程介绍目录 建议: <java并发编程实战>第 ...
- Java多线程编程实战读书笔记(一)
多线程的基础概念本人在学习多线程的时候发现一本书——java多线程编程实战指南.整理了一下书中的概念制作成了思维导图的形式.按照书中的章节整理,并添加一些个人的理解.
- 《Java并发编程实战》第十五章 原子变量与非堵塞同步机制 读书笔记
一.锁的劣势 锁定后假设未释放.再次请求锁时会造成堵塞.多线程调度通常遇到堵塞会进行上下文切换,造成很多其它的开销. 在挂起与恢复线程等过程中存在着非常大的开销,而且通常存在着较长时间的中断. 锁可能 ...
- 《Java并发编程实战》第十六章 Java内存模型 读书笔记
Java内存模型是保障多线程安全的根基,这里不过认识型的理解总结并未深入研究. 一.什么是内存模型,为什么须要它 Java内存模型(Java Memory Model)并发相关的安全公布,同步策略的规 ...
- 《Java并发编程实战》第十二章 测试并发程序 读书笔记
并发测试分为两类:安全性测试(无论错误的行为不会发生)而活性测试(会发生). 安全測试 - 通常採用測试不变性条件的形式,即推断某个类的行为是否与其它规范保持一致. 活跃性測试 - 包含进展測试和无进 ...
- 《Java并发编程实战》第十四章 构建自己定义的同步工具 读书笔记
一.状态依赖性的管理 有界缓存实现的基类 @ ThreadSafe public abstract class BaseBoundedBuffer<E> { @GuardeBy( &quo ...
- Java并发编程实践读书笔记(5) 线程池的使用
Executor与Task的耦合性 1,除非线程池很非常大,否则一个Task不要依赖同一个线程服务中的另外一个Task,因为这样容易造成死锁: 2,线程的执行是并行的,所以在设计Task的时候要考虑到 ...
- Java并发编程艺术读书笔记
1.多线程在CPU切换过程中,由于需要保存线程之前状态和加载新线程状态,成为上下文切换,上下文切换会造成消耗系统内存.所以,可合理控制线程数量. 如何控制: (1)使用ps -ef|grep appn ...
随机推荐
- 51 (OC) NSURLComponent 组成部分。
网页地址协议 url scheme
- Navicat Premium 连oralce报错:oracle library is not loaded
我装的Navicat Premium是64位的,计算机也是64位的,故在oracle网上下了一个64位的instantclient-basic-windows.x64-11.2.0.4.0.zip 地 ...
- 第一次接触WebSocket遇到的坑以及感受
要求用.net写一个服务,然后通过webscoket实现客户端与服务端之间的通信. 第一次知道.net还可以用来写服务,然后问题来了,服务是什么- -..下面图里的就是服务,可以停止暂停和启动. 我要 ...
- Linux遇到的问题-记录
Linux遇到的问题 2019-04-09以前: Linux&Win双系统下时间显示不正常的问题 一般安装了双系统(Linux+Windows)就很容易出现问题,Windows是直接取硬件时间 ...
- 字符串转数字(with Java)
1. 字符串中提取数字 两个函数可以帮助我们从字符串中提取数字(整型.浮点型.字符型...). parseInt().parseFloat() valueOf() String str = " ...
- [AspNetCore 3.0] 在RazorPages/MVC 中使用 Blazor (Razor组件)
开发环境 Vs2019 16.3.1 dotnetcore 3.0 一.开始 新建webapp项目 dotnet new webapp -o projectname 或Vs 中新建项目选择 Web应用 ...
- uni-app实现滑动切换效果
在对于uni-app框架了解之后,今天就实现一个滚动切换tab效果,这个很常见的一个效果,最后封装成一个组件,便于以后使用,写这个需要引入uni官方提供的uni.css样式,用到了写好的样式,就不需要 ...
- mybatis - 通用mapper
title: 玩转spring-boot-mybatis date: 2019-03-11 19:36:57 type: "mybatis" categories: mybatis ...
- Hyper-V安装CentOS 8问题
CentOS 8 已经发布很长时间了,作为一直折腾Linux虚拟机的一员怎么少的了我. 环境&准备工作 系统:Win 10 pro 19H1 虚拟机:Hyper-V ISO:CentOS 8 ...
- MongoDB 学习笔记之 WriteConcern
WriteConcern: 转载:MongoDB WriteConcern(写关注)机制 http://www.ywnds.com/?p=3688&viewuser=40 MongoDB部署模 ...