(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76690961冷血之心的博客)

博主准备恶补一番Java高并发编程相关知识,接下来将阅读该书,并且进行比较详细的总结,好记性不如烂笔头,加油。

Java多线程编程实战指南(核心篇)读书笔记(四),主要记录该书第七章和第八章的基本概念等知识,后续部分将会持续更新哦~欢迎关注本博客。


  1. 线程活性故障
    1. 死锁(Deadlock)
      1. 如果多个线程因相互等待对方而被永远暂停(线程生命周期状态为Blocked或者Waiting),则称之为产生了死锁.
      2. 死锁产生的四个必要条件:
        1. 互斥条件:一个资源每次只能被一个线程使用
        2. 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放
        3. 不剥夺条件:进程已经获得的资源,在未使用完之前,不能强行剥夺
        4. 循环等待条件:若干线程之间形成一种头尾相接的循环等待资源关系
      3. 死锁的避免方法:
        1. 粗锁法(Coarsen-grained Lock):使用粗粒度的锁代替多个锁
        2. 锁排序法(Lock Ordering):相关线程使用全局统一顺序申请锁
        3. 使用ReentrantLock.tryLock( )搞定
        4. 终极大招:不使用锁,啊哈哈~~~
      4. 死锁的恢复:
        1. 定义一个工作者线程专门用于死锁检测与恢复
        2. 死锁恢复意义不大
    2. 锁死(Lockout)
      1. 等待线程由于唤醒条件永远无法成立,导致该线程一直处于非运行状态,称为这个线程锁死了。
        1. 信号丢失锁死
          1. wait方法之前没有对保护条件进行判断
        2. 嵌套监视器锁死
          1. 嵌套锁导致等待线程永远无法被唤醒的一种活性故障
    3. 线程饥饿(Thread Starvation)
      1. 指线程一直无法获取其所需的资源而导致其任务一直无法进展的一种活性故障
    4. 活锁(LiveLock)
      1. 指线程一直处于运行状态,但是其任务却一直无法进展的一种活性故障
  2. 线程管理
    1. 线程组(ThreadGroup)已废弃
    2. 可靠性:线程的未捕获异常与监控
      1. 接口:UncaughExceptionHandler
      2. 该接口在Thread类内部定义,只定义了一个方法void uncaughtException(Thread t, Throwable e)
    3. 线程工厂(ThreadFactory)
      1. 方法public Thread newThread(Runnable r)
    4. 线程池
      1. 线程的开销如下:
        1. 线程的创建与启动的开销
        2. 线程的销毁
        3. 线程调度的开销
        4. 一个系统能够创建的线程总数总是受限于该系统的所拥有的处理器数目
      2. 线程池工作原理:
        1. JUC中的线程池:
          1. java.util.concurrent.ThreadPoolExecutor类就是一个线程池
          2. 客户端调用ThreadPoolExecutor.submit(Runnable task)提交任务
          3. 线程池内部维护的工作者线程的数量就是该线程池的线程池大小,有3种形态:
            1. 当前线程池大小:表示线程池中实际工作者线程的数量
            2. 最大线程池大小(maxinumPoolSize :表示线程池中允许存在的工作者线程的数量上限
            3. 核心线程大小(corePoolSize :表示一个不大于最大线程池大小的工作者线程数量上限
              1. 如果运行的线程少于corePoolSize,则Executor始终首选添加新的线程,而不进行排队
              2. 如果运行的线程等于或者多于corePoolSize,则Executor始终首选将请求加入队列,而不是添加新线程
              3. 如果无法将请求加入队列,即队列已经满了,则创建新的线程,除非创建此线程超出maxinumPoolSize,在这种情况下,任务将被拒绝。
          4. 线程池通过threadFactory.newThread方法来创建新的线程
          5. Executors中提供了创建线程池的快捷方法:
            1. newCachedThreadPool( )
              1. 核心线程池大小为0,最大线程池大小不受限;来一个创建一个线程
              2. 适合用来执行大量耗时较短且提交频率较高的任务
            2. newFixedThreadPool( )
              1. 固定大小的线程池
              2. 当线程池大小达到核心线程池大小,就不会增加也不会减小工作者线程的固定大小的线程池
            3. newSingleThreadExecutor( )
              1. 便于实现单(多)生产者-消费者模式
          6. 线程池关闭:
            1. ThreadPoolExecutor.shutdown( )/shutdownNow( )
    5. 任务的处理结果、异常处理与取消
      1. Callable接口也是对任务的抽象,相当于一个增强型的Runnable接口,提供返回值代表任务的处理结果;
      2. 返回结果为Future,该Future接口实例可被看做提交给线程池执行的任务的处理结果句柄(Handler)。
      3. 客户端代码应该尽可能早的向线程池提交任务,并仅在需要相应任务的处理结果数据的那一刻才调用Future.get()方法
    6. 线程池监控
      1. ThreadPoolExecutor提供了线程池监控相关方法
    7. 线程池死锁:
      1. 同一个线程池只能用于执行相互独立的任务。彼此有依赖关系的任务需要提交给不同的线程池执行以避免死锁



如果对你有帮助,记得点赞哦~欢迎大家关注我的博客,我会持续更新后续章节学习笔记,可以进群366533258一起交流学习哦~

本群给大家提供一个学习交流的平台,内设菜鸟Java管理员一枚、精通算法的金牌讲师一枚、Android管理员一枚、蓝牙BlueTooth管理员一枚、Web前端管理一枚以及C#管理一枚。欢迎大家进来交流技术。



Java多线程编程实战指南(核心篇)读书笔记(四)的更多相关文章

  1. Java多线程编程实战指南 核心篇 读书笔记

    锁 volatile CAS final static 原子性保障 具备 具备 具备 不涉及 不涉及 可见性保障 具备 具备 不具备 不具备 具备① 有序性保证 具备 具备 不涉及 具备 具备② 上下 ...

  2. 《Java多线程编程实战指南+设计模式篇》笔记

    线程的监视:工具:jvisualvm.exe 命令:jstack PID 原子性: volatile关键字: 显示锁:人为实现的程序员可控制的锁,包括synchronized和Lock下的实现类: 线 ...

  3. Java多线程编程实战指南(核心篇)读书笔记(五)

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76730459冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...

  4. Java多线程编程实战指南(核心篇)读书笔记(三)

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76686044冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...

  5. Java多线程编程实战指南(核心篇)读书笔记(二)

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76651408冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...

  6. Java多线程编程实战指南(核心篇)读书笔记(一)

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76422930冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...

  7. 《Java多线程编程实战指南(核心篇)》阅读笔记

    <Java多线程编程实战指南(核心篇)>阅读笔记 */--> <Java多线程编程实战指南(核心篇)>阅读笔记 Table of Contents 1. 线程概念 1.1 ...

  8. Java多线程编程实战指南 设计模式 读书笔记

    线程设计模式在按其有助于解决的多线程编程相关的问题可粗略分类如下. 不使用锁的情况下保证线程安全: Immutable Object(不可变对象)模式.Thread Specific Storage( ...

  9. 学习笔记《Java多线程编程实战指南》三

    3.1串行.并发与并行 1.串行:一件事做完接着做下一件事. 2.并发:几件事情交替进行,统筹资源. 3.并行:几件事情同时进行,齐头并进,各自运行直到结束. 多线程编程的实质就是将任务处理方式由串行 ...

随机推荐

  1. web.xml listener配置

    listener简介: <listener>能为web应用创建监视器,监听上下文的各种事件,如:application和session事件,这些监视器都是按相同的方式定义,它的功能取决于各 ...

  2. 20145307陈俊达《信息安全系统设计基础》第5周学习总结PT1

    20145307陈俊达<信息安全系统设计基础>第5周学习总结 教材学习内容总结 X86寻址方式经历三代: DOS时代的平坦模式,不安全,原因是没有区分用户空间和内核空间 8086的分段模式 ...

  3. 如何使用curl进行网页授权

    答:使用curl的-u选项,使用方法如下 curl -u username URL (会提示输入密码)

  4. Redis之Redis

    Redis 环境安装 安装 如果已经安装了老版本3.0.6 1. 卸载软件 sudo apt-get remove redis-server 2. 清除配置 sudo apt-get remove - ...

  5. 浅谈const限定符

    什么是const限定符? Const限定符是我们通常所说的常量限定符,被const修饰的对象具有常量性质,只能读,不能写. 为什么使用const限定符? 用const变量取代“魔数”,代码更容易理解和 ...

  6. 解决"此请求已被阻止,因为当用在 GET 请求中时,会将敏感信息透漏给第三方网站"的问题

    在ASP.NET MVC项目中,使用AJAX向控制器发送GET请求获取JSON数据时,出现这个错误:"此请求已被阻止,因为当用在 GET 请求中时,会将敏感信息透漏给第三方网站.若要允许 G ...

  7. POJ - 3255 次短路径

    题意:给你无向带权图,求次短路径 题解:加一个次短路的数组,用于距记录源点到此点的次短路长度,注意初始化是源点到自己的次短路是极大值 接着再使用dijkstra算法,它是每次选用现在连上(记录了)的点 ...

  8. sickit-learn库实现机器学习

    sickit-learn库实现机器学习 [TOC] Iris数据集 from sklearn import datasets iris=datasets.load_iris() # 数据 iris.d ...

  9. Vim练级攻略(转)

    转自平凡的世界:http://www.ccvita.com/ 前言今天看到这篇文章,共鸣点非常多.它把Vim使用分为4个级别,目前我自己是熟练运用前面三级的命令,在培养习惯使用第四级.完全就是我这一年 ...

  10. WinCE数据通讯之Web Service分包传输篇

    前面写过<WinCE数据通讯之Web Service篇>那篇对于数据量不是很大的情况下单包传输是可以了,但是对于大数据量的情况下WinCE终端的内存往往会在解包或者接受数据时产生内存溢出. ...