Java多线程编程实战指南(核心篇)读书笔记(四)
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76690961冷血之心的博客)
博主准备恶补一番Java高并发编程相关知识,接下来将阅读该书,并且进行比较详细的总结,好记性不如烂笔头,加油。
Java多线程编程实战指南(核心篇)读书笔记(四),主要记录该书第七章和第八章的基本概念等知识,后续部分将会持续更新哦~欢迎关注本博客。
目录:
- 线程活性故障
- 死锁(Deadlock)
- 如果多个线程因相互等待对方而被永远暂停(线程生命周期状态为Blocked或者Waiting),则称之为产生了死锁.
- 死锁产生的四个必要条件:
- 互斥条件:一个资源每次只能被一个线程使用
- 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放
- 不剥夺条件:进程已经获得的资源,在未使用完之前,不能强行剥夺
- 循环等待条件:若干线程之间形成一种头尾相接的循环等待资源关系
- 死锁的避免方法:
- 粗锁法(Coarsen-grained Lock):使用粗粒度的锁代替多个锁
- 锁排序法(Lock Ordering):相关线程使用全局统一顺序申请锁
- 使用ReentrantLock.tryLock( )搞定
- 终极大招:不使用锁,啊哈哈~~~
- 死锁的恢复:
- 定义一个工作者线程专门用于死锁检测与恢复
- 死锁恢复意义不大
- 锁死(Lockout)
- 等待线程由于唤醒条件永远无法成立,导致该线程一直处于非运行状态,称为这个线程锁死了。
- 信号丢失锁死
- wait方法之前没有对保护条件进行判断
- 嵌套监视器锁死
- 嵌套锁导致等待线程永远无法被唤醒的一种活性故障
- 信号丢失锁死
- 等待线程由于唤醒条件永远无法成立,导致该线程一直处于非运行状态,称为这个线程锁死了。
- 线程饥饿(Thread Starvation)
- 指线程一直无法获取其所需的资源而导致其任务一直无法进展的一种活性故障
- 活锁(LiveLock)
- 指线程一直处于运行状态,但是其任务却一直无法进展的一种活性故障
- 死锁(Deadlock)
- 线程管理
- 线程组(ThreadGroup)已废弃
- 可靠性:线程的未捕获异常与监控
- 接口:UncaughExceptionHandler
- 该接口在Thread类内部定义,只定义了一个方法void uncaughtException(Thread t, Throwable e)
- 线程工厂(ThreadFactory)
- 方法public Thread newThread(Runnable r)
- 线程池
- 线程的开销如下:
- 线程的创建与启动的开销
- 线程的销毁
- 线程调度的开销
- 一个系统能够创建的线程总数总是受限于该系统的所拥有的处理器数目
- 线程池工作原理:
- JUC中的线程池:
- java.util.concurrent.ThreadPoolExecutor类就是一个线程池
- 客户端调用ThreadPoolExecutor.submit(Runnable task)提交任务
- 线程池内部维护的工作者线程的数量就是该线程池的线程池大小,有3种形态:
- 当前线程池大小:表示线程池中实际工作者线程的数量
- 最大线程池大小(maxinumPoolSize ):表示线程池中允许存在的工作者线程的数量上限
- 核心线程大小(corePoolSize ):表示一个不大于最大线程池大小的工作者线程数量上限
- 如果运行的线程少于corePoolSize,则Executor始终首选添加新的线程,而不进行排队
- 如果运行的线程等于或者多于corePoolSize,则Executor始终首选将请求加入队列,而不是添加新线程
- 如果无法将请求加入队列,即队列已经满了,则创建新的线程,除非创建此线程超出maxinumPoolSize,在这种情况下,任务将被拒绝。
- 线程池通过threadFactory.newThread方法来创建新的线程
- Executors中提供了创建线程池的快捷方法:
- newCachedThreadPool( )
- 核心线程池大小为0,最大线程池大小不受限;来一个创建一个线程
- 适合用来执行大量耗时较短且提交频率较高的任务
- newFixedThreadPool( )
- 固定大小的线程池
- 当线程池大小达到核心线程池大小,就不会增加也不会减小工作者线程的固定大小的线程池
- newSingleThreadExecutor( )
- 便于实现单(多)生产者-消费者模式
- newCachedThreadPool( )
- 线程池关闭:
- ThreadPoolExecutor.shutdown( )/shutdownNow( )
- 线程的开销如下:
- 任务的处理结果、异常处理与取消
- Callable接口也是对任务的抽象,相当于一个增强型的Runnable接口,提供返回值代表任务的处理结果;
- 返回结果为Future,该Future接口实例可被看做提交给线程池执行的任务的处理结果句柄(Handler)。
- 客户端代码应该尽可能早的向线程池提交任务,并仅在需要相应任务的处理结果数据的那一刻才调用Future.get()方法
- 线程池监控
- ThreadPoolExecutor提供了线程池监控相关方法
- 线程池死锁:
- 同一个线程池只能用于执行相互独立的任务。彼此有依赖关系的任务需要提交给不同的线程池执行以避免死锁
如果对你有帮助,记得点赞哦~欢迎大家关注我的博客,我会持续更新后续章节学习笔记,可以进群366533258一起交流学习哦~
本群给大家提供一个学习交流的平台,内设菜鸟Java管理员一枚、精通算法的金牌讲师一枚、Android管理员一枚、蓝牙BlueTooth管理员一枚、Web前端管理一枚以及C#管理一枚。欢迎大家进来交流技术。
Java多线程编程实战指南(核心篇)读书笔记(四)的更多相关文章
- Java多线程编程实战指南 核心篇 读书笔记
锁 volatile CAS final static 原子性保障 具备 具备 具备 不涉及 不涉及 可见性保障 具备 具备 不具备 不具备 具备① 有序性保证 具备 具备 不涉及 具备 具备② 上下 ...
- 《Java多线程编程实战指南+设计模式篇》笔记
线程的监视:工具:jvisualvm.exe 命令:jstack PID 原子性: volatile关键字: 显示锁:人为实现的程序员可控制的锁,包括synchronized和Lock下的实现类: 线 ...
- Java多线程编程实战指南(核心篇)读书笔记(五)
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76730459冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...
- Java多线程编程实战指南(核心篇)读书笔记(三)
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76686044冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...
- Java多线程编程实战指南(核心篇)读书笔记(二)
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76651408冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...
- Java多线程编程实战指南(核心篇)读书笔记(一)
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76422930冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...
- 《Java多线程编程实战指南(核心篇)》阅读笔记
<Java多线程编程实战指南(核心篇)>阅读笔记 */--> <Java多线程编程实战指南(核心篇)>阅读笔记 Table of Contents 1. 线程概念 1.1 ...
- Java多线程编程实战指南 设计模式 读书笔记
线程设计模式在按其有助于解决的多线程编程相关的问题可粗略分类如下. 不使用锁的情况下保证线程安全: Immutable Object(不可变对象)模式.Thread Specific Storage( ...
- 学习笔记《Java多线程编程实战指南》三
3.1串行.并发与并行 1.串行:一件事做完接着做下一件事. 2.并发:几件事情交替进行,统筹资源. 3.并行:几件事情同时进行,齐头并进,各自运行直到结束. 多线程编程的实质就是将任务处理方式由串行 ...
随机推荐
- hadoop hdfs设置quota
quota分为两种: 1. 目录下的文件数限制 2. 目录下的空间大小 //设置文件数 hdfs dfsadmin -setQuota 1000000 /user/jenkin //设置空间大小 hd ...
- 20145314郑凯杰 《Java程序设计》第1周学习总结
20145314郑凯杰 <Java程序设计>第1周学习总结 教材学习内容总结 跟着教材的顺序开始总结我学过的内容: 1.三大平台 JAVA SE ,JAVA EE,JAVA ME 从毕向东 ...
- 20145321 《Java程序设计》第一周学习总结
20145321 <Java程序设计>第1周学习总结 教材学习内容总结 第一章 1.三大平台:Java SE.Java EE .Java ME 2.Java SE:由JVM.JRE.JDK ...
- 《Java 程序设计》团队博客第十一周(第一次)
<Java 程序设计>团队博客第十一周(第一次) 团队项目 1.项目内容.目标 项目内容 本组的团队项目准备实现一个有关于大富翁有的游戏程序. 大富翁游戏,以经营权为主要的游戏方式,通过购 ...
- 起源游戏临时实体(Temp Entity)
如何查看实体 https://wiki.alliedmods.net/Temp_Entity_Lists_(Source) 这里是部分游戏的临时实体列表 # 还可以通过在游戏内输入来获取游戏的临时实体 ...
- nsis源码 nsisdialogdesigner
; 安装程序初始定义常量!define PRODUCT_NAME "nsisdialogdesigner"!define PRODUCT_VERSION "1.1.3&q ...
- Swift学习笔记 - Swift属性只读
在OC中我们经常用到只读属性,用readonly修饰一下就行了,但在Swift中已经不是这样修饰的了,下面记录一下Swift中只读属性的使用 在OC中的只读: //只读属性 @property(rea ...
- Shell学习小结 - 深入认识变量
移动端访问不佳,请访问我的个人博客 变量的命名 对于初学者来说,可以简单的理解为,变量就是保存在计算机内存中的一系列的键值对. 列如: str="hello" 这里的str就是变量 ...
- HDU 5773 The All-purpose Zero(O(nlgn)求LIS)
http://acm.hdu.edu.cn/showproblem.php?pid=5773 题意: 求LIS,其中的0可以看做任何数. 思路: 因为0可以看做任何数,所以我们可以先不管0,先求一遍L ...
- 在HTTP通讯过程中,是客户端还是服务端主动断开连接?
比如说:IE访问IIS,获取文件,肯定是要建立一个连接,这个连接在完成通讯后,是客户端Close了连接,还是服务端Close了连接.我用程序测模拟IE和IIS,都没有收到断开连接的消息,也就是都没有触 ...