java并发编程的艺术——第一章总结
并发编程的挑战
- 1.1上下文切换
- 1.2死锁
- 1.3资源限制的挑战
- 1.4本章小结
1.1上下文切换
- 1.1.1多线程一定快吗
- 1.1.2测试上下文切换次数和时长
- 1.1.3如何减少上下文切换
- 1.1.4减少上下文切换实战
支持多线程的处理器不论核心数目都支持多线程执行代码(单核心当然也支持)。
多线程实现机制:CPU给每个线程分配CPU时间片实现。
时间片:CPU分配给各个线程的时间。
注:因为时间片很短,所以CPU通过不停地切换线程来执行,让我们感觉到多线程是同时执行的,时间片一般是几十毫秒(ms)
CPU通过时间片分配算法来循环执行任务,当切换任务时,会保存上一个任务的状态,切换任务后也会加载当前任务的状态。
上下文切换:任务从保存到再加载的过程就是一次上下文切换。
由于有加载状态与保存状态的机制存在,上下文切换实际上会影响多线程的执行速度。
1.1.1多线程一定快吗
从文章示例看是不一定的:即当并发执行次数较少(少于百万级别),速度较串行执行慢,出现这样的情况是由于:线程的创建与上下文切换的开销。
1.1.2测试上下文切换次数和时长
从文章示例看:上下文切换大概一秒进行1000多次。
使用Lmbench3测量上下文切换的时长,使用vmstat测量上下文切换的次数
注:CS(Content Switch)表示上下文切换的次数。
1.1.3如何减少上下文切换
方法:无锁并发编程、CAS算法、使用最少线程和使用协程。
无锁并发编程:多线程竞争锁时,会引起上下文切换,所以在多线程处理数据时可以使用一些办法来避免使用锁。
将数据的ID按照Hash算法取模分段,不同的线程处理不同段的数据。
CAS算法:java中的Atomic包使用CAS算法来更新数据,而不需要加锁。
使用最少线程:避免创建不必要的线程,比如任务较少时,创建很多线程来处理,这样会导致大量线程处于等待状态。
协程:在单线程里实现多任务的调度,并在单线程里维持多个任务间的切换。(这个协程这里看不懂)。
1.1.4减少上下文切换实战
这里就变到命令行操作了。具体的我就不沾了,讲一下优化思路。
通过减少大量WAITING的线程,来减少上下文切换次数。
他通过命令行发现了大量的闲置线程,然后发现闲置线程是线程池中的工作线程(这里说明线程池接受的任务较少,大量线程闲置),然后找到配置文件修改了线程的最大数量,然后重启线程池。
WAITING线程少了系统上下文切换的次数就会少,因为每一次从WAITING到RUNNABLE都会进行一次上下文切换。
1.2死锁
首先死锁是工具,运用场景多,但是导致的问题是,一旦死锁,系统功能不可用。
写了一段代码演示死锁,代码不沾了,记住死锁的核心原因:不同线程等待不可能释放的锁。
一旦出现死锁,只能dump线程查看到底哪个线程出了问题(这里需要专门做一次dump线程的笔记)。
死锁问题很严重,常用的避免方式:
1)避免一个线程同时获取多个锁
2)避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源
3)尝试使用定时锁,使用lock.tryLcok(timeout)来替代使用内部锁机制。
4)对于数据库锁,加锁和解锁必须在一个数据库连接里,否则就会出现解锁失败的情况。
1.3资源限制的挑战
资源限制:程序的执行受限于计算机硬件资源或软件资源。
硬件资源限制:带宽的上传/下载速度,硬盘读写速度和CPU处理速度。 软件资源限制:数据库连接数和socket连接数。
引发的问题:程序将串行执行的部分改为并行执行后,由于资源限制还是并行执行,导致了不仅不快反而更慢(上下文切换,资源的调度都需要时间)。
如何解决:
硬件资源限制可以尝试集群解决。
软件资源限制:将资源池复用。
在资源限制的情况下进行并发编程:根据资源限制调整程序的并发度。
1.4本章总结:
有可能是因为我的知识水平有限,这一章看起来除了一些理论的补充,看起来有点空洞的!
也可能是目前根本没有接触过多线程的编程吧。
不过最后作者提出了宝贵的建议:熟练使用JDK并发容器与工具类。学无止境啊。
注:本书的2、3章节由于涉及计算机与JVM的知识比较多,总结起来相对难度较大,语言也很难凝练,而且对我来说还需要很多理解所以本书从第四章开始总结,2、3章的总结会暂缓
本文内容是书中内容兼具自己的个人看法所成。可能在个人看法上会有诸多问题(毕竟知识量有限,导致认知也有限),如果读者觉得有问题请大胆提出,我们可以相互交流、相互学习,欢迎你们的到来,心成意足,等待您的评价。
java并发编程的艺术——第一章总结的更多相关文章
- 【java并发编程实战】第一章笔记
1.线程安全的定义 当多个线程访问某个类时,不管允许环境采用何种调度方式或者这些线程如何交替执行,这个类都能表现出正确的行为 如果一个类既不包含任何域,也不包含任何对其他类中域的引用.则它一定是无状态 ...
- 《Java并发编程的艺术》留给自己以后看的笔记
<Java并发编程的艺术>这本书特别好,和<深入了解JAVA虚拟机>有一拼,建议做java的都看看,下面全部都是复制书中的部分内容,主要目的是做个笔记,方便以后遇到问题能找到. ...
- 读《Java并发编程的艺术》学习笔记(一)
接下来一个系列,是关于<Java并发编程的艺术>这本书的读书笔记以及相关知识点,主要是为了方便日后多次复习和防止忘记.废话不多说,直接步入主题: 第1章 并发编程的挑战 并发编程的目的是 ...
- 《Java并发编程的艺术》读书笔记:二、Java并发机制的底层实现原理
二.Java并发机制底层实现原理 这里是我的<Java并发编程的艺术>读书笔记的第二篇,对前文有兴趣的朋友可以去这里看第一篇:一.并发编程的目的与挑战 有兴趣讨论的朋友可以给我留言! 1. ...
- 读《Java并发编程的艺术》(一)
离开博客园很久了,自从找到工作,到现在基本没有再写过博客了.在大学培养起来的写博客的习惯在慢慢的消失殆尽,感觉汗颜.所以现在要开始重新培养起这个习惯,定期写博客不仅是对自己学习知识的一种沉淀,更是在督 ...
- Java并发编程的艺术读书笔记(2)-并发编程模型
title: Java并发编程的艺术读书笔记(2)-并发编程模型 date: 2017-05-05 23:37:20 tags: ['多线程','并发'] categories: 读书笔记 --- 1 ...
- Java并发编程的艺术读书笔记(1)-并发编程的挑战
title: Java并发编程的艺术读书笔记(1)-并发编程的挑战 date: 2017-05-03 23:28:45 tags: ['多线程','并发'] categories: 读书笔记 --- ...
- 那些年读过的书《Java并发编程实战》和《Java并发编程的艺术》三、任务执行框架—Executor框架小结
<Java并发编程实战>和<Java并发编程的艺术> Executor框架小结 1.在线程中如何执行任务 (1)任务执行目标: 在正常负载情况下,服务器应用 ...
- Java并发编程的艺术(六)——线程间的通信
多条线程之间有时需要数据交互,下面介绍五种线程间数据交互的方式,他们的使用场景各有不同. 1. volatile.synchronized关键字 PS:关于volatile的详细介绍请移步至:Java ...
随机推荐
- 移动端1px 边框完整方案(四个方向)
使用stylus(预处理) 需要一个函数接收两个参数 第一个需要在哪个方向出现边框 第二个边框颜色 $border1px(face,$color) 根据传入的方向属性,调整其他参数 l 左右方向 t ...
- Nginx服务及编译安装
第1章 Nginx 1.1 nginx的概念 Nginx("engine x")是一个开源的.支持高性能.高并发的WWW服务和代理服务软件,具有高开发(特别是静态资源),占用系统资 ...
- EM 算法求解高斯混合模型python实现
注:本文是对<统计学习方法>EM算法的一个简单总结. 1. 什么是EM算法? 引用书上的话: 概率模型有时既含有观测变量,又含有隐变量或者潜在变量.如果概率模型的变量都是观测变量,可以直接 ...
- Tomcat部署项目乱码问题总结
打包好的war包放在tomcat下,有时会出现中文乱码的情况.首先应当确定项目的编码格式,tomcat的编码格式,以及cmd命令行的编码格式. 项目编码 将要输出到控制台或日志的字符串转为UTF-8 ...
- linux kernel态下使用NEON对算法进行加速
ARM处理器从cortex系列开始集成NEON处理单元,该单元可以简单理解为协处理器,专门为矩阵运算等算法设计,特别适用于图像.视频.音频处理等场景,应用也很广泛. 本文先对NEON处理单元进行简要介 ...
- Visual Studio 2017开发环境的安装
Visual Studio 2017是微软为了配合.NET战略推出的IDE开发环境,同时也是目前开发C#程序最新的工具,本节以Visual Studio 2017社区版的安装为例讲解具体的安装步骤. ...
- linux操作系统基础篇(九)
shell脚本的运算符与流程控制 1.运算符 1.1 算术运算符 + - * / % [root@MiWiFi-R3-srv ~]# echo $[3+1]4 1.2 关系操作 与(())连用 < ...
- tensorflow 从入门到摔掉肋骨 教程二
构造你自己的第一个神经网络 通过手势的图片识别图片比划的数字:1) 现在用1080张64*64的图片作为训练集2) 用120张图片作为测试集 定义初始化值 def load_dataset(): ...
- 深入浅出Java动态代理
文章首发于[博客园-陈树义],点击跳转到原文深入浅出Java动态代理 代理模式是设计模式中非常重要的一种类型,而设计模式又是编程中非常重要的知识点,特别是在业务系统的重构中,更是有举足轻重的地位.代理 ...
- 企业级应用TOMCAT
第1章 Tomcat 1.1 Tomcat简介 Tomcat是一个免开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不多的场合下被普遍使用,是开发调试JSP程序的首选,另 ...