并发编程的挑战


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并发编程的艺术——第一章总结的更多相关文章

  1. 【java并发编程实战】第一章笔记

    1.线程安全的定义 当多个线程访问某个类时,不管允许环境采用何种调度方式或者这些线程如何交替执行,这个类都能表现出正确的行为 如果一个类既不包含任何域,也不包含任何对其他类中域的引用.则它一定是无状态 ...

  2. 《Java并发编程的艺术》留给自己以后看的笔记

    <Java并发编程的艺术>这本书特别好,和<深入了解JAVA虚拟机>有一拼,建议做java的都看看,下面全部都是复制书中的部分内容,主要目的是做个笔记,方便以后遇到问题能找到. ...

  3. 读《Java并发编程的艺术》学习笔记(一)

    接下来一个系列,是关于<Java并发编程的艺术>这本书的读书笔记以及相关知识点,主要是为了方便日后多次复习和防止忘记.废话不多说,直接步入主题: 第1章  并发编程的挑战 并发编程的目的是 ...

  4. 《Java并发编程的艺术》读书笔记:二、Java并发机制的底层实现原理

    二.Java并发机制底层实现原理 这里是我的<Java并发编程的艺术>读书笔记的第二篇,对前文有兴趣的朋友可以去这里看第一篇:一.并发编程的目的与挑战 有兴趣讨论的朋友可以给我留言! 1. ...

  5. 读《Java并发编程的艺术》(一)

    离开博客园很久了,自从找到工作,到现在基本没有再写过博客了.在大学培养起来的写博客的习惯在慢慢的消失殆尽,感觉汗颜.所以现在要开始重新培养起这个习惯,定期写博客不仅是对自己学习知识的一种沉淀,更是在督 ...

  6. Java并发编程的艺术读书笔记(2)-并发编程模型

    title: Java并发编程的艺术读书笔记(2)-并发编程模型 date: 2017-05-05 23:37:20 tags: ['多线程','并发'] categories: 读书笔记 --- 1 ...

  7. Java并发编程的艺术读书笔记(1)-并发编程的挑战

    title: Java并发编程的艺术读书笔记(1)-并发编程的挑战 date: 2017-05-03 23:28:45 tags: ['多线程','并发'] categories: 读书笔记 --- ...

  8. 那些年读过的书《Java并发编程实战》和《Java并发编程的艺术》三、任务执行框架—Executor框架小结

    <Java并发编程实战>和<Java并发编程的艺术>           Executor框架小结 1.在线程中如何执行任务 (1)任务执行目标: 在正常负载情况下,服务器应用 ...

  9. Java并发编程的艺术(六)——线程间的通信

    多条线程之间有时需要数据交互,下面介绍五种线程间数据交互的方式,他们的使用场景各有不同. 1. volatile.synchronized关键字 PS:关于volatile的详细介绍请移步至:Java ...

随机推荐

  1. MyEclipse和Eclipse非常方便的快捷键

    1. ctrl+shift+r:打开资源这可能是所有快捷键组合中最省时间的了.这组快捷键可以让你打开你的工作区中任何一个文件,而你只需要按下文件名或mask名中的前几个字母,比如applic*.xml ...

  2. C#动态获取鼠标坐标

    .Net封装好的方法 int Control.MousePosition.X;int Control.MousePosition.Y; 用API方法 using System.Runtime.Inte ...

  3. 移动端效果之LoadMore

    写在前面 列表一直是展示数据的一个重要方式,在手机端的列表展示又和PC端展示不同,毕竟手机端主要靠滑.之前手机端之前一直使用的IScroll,但是IScroll本身其实有很多兼容性BUG,想改动一下需 ...

  4. [转载] 布隆过滤器(Bloom Filter)详解

    转载自http://www.cnblogs.com/haippy/archive/2012/07/13/2590351.html   布隆过滤器[1](Bloom Filter)是由布隆(Burton ...

  5. 《java.util.concurrent 包源码阅读》05 BlockingQueue

    想必大家都很熟悉生产者-消费者队列,生产者负责添加元素到队列,如果队列已满则会进入阻塞状态直到有消费者拿走元素.相反,消费者负责从队列中拿走元素,如果队列为空则会进入阻塞状态直到有生产者添加元素到队列 ...

  6. 十一、VueJs 填坑日记之使用Amaze ui调整列表和内容页面

    上一篇博文我们整合了Amaze ui,并且调整了一个头部header和底部footer文件,其实做起来也很简单,只要按照步骤来做,完全没有问题.今天我们来重新调整一下列表页面和内容页面,使我们做的后台 ...

  7. Redis在本地测试没有问题,上传的服务器后出现错误

    在服务器上,new Redis 可以拿到对象数据,但是其他操作就会报错. Redis 开启过程中,遇到错误 . :( protocol error, got 'S' as reply type byt ...

  8. C语言一些知识点总结

    一.关键字 1. 什么是关键字 1> 关键字就是C语言提供的有特殊含义的符号,也叫做“保留字” 2> C语言一共提供了32个关键字,这些关键字都被C语言赋予了特殊含义 auto doubl ...

  9. Spring Cloud教程合集

    Spring Cloud系列终于搞完啦! 这一系列是笔者的学习笔记,原书之前也给小伙伴们推荐过 <Spring Cloud微服务实战> 原书采用了较老的Brixton版,笔者在学习的过程中 ...

  10. JSP7(Cookie与javamail)

    一.cookie是什么意思? 英文直接翻译过来的意思呢就是小甜品 Cookie英文意指饼干,不过在电脑术语中它可不像饼干那么简单.简单的说,Cookie就是服务器暂存放在你计算机上的一笔资料,好让服务 ...