《JAVA并发编程实践》学习笔记(第六.七章)

【尚硅谷周阳--JUC并发编程】【第七章--volatile与JMM】 通过内存屏障禁重排重排有可能影响程序的执行和实现,因此,我们有时候希望告诉JVM你别“自作聪明”给我重排序,我这里不需要重排序对于编译器的重排序,JMM会根据重排序的规则,禁止特定类型的编译器重排序对于处理器的重排序,Java编译器在生成指令序列的适当位置,插入内存屏障指令,来禁止特定类型的处理器排序。写指令。 阅读详情

第2部分

构建并发应用程序

第6章 任务执行

       大多数并发应用程序都是围绕执行任务(task)进行管理。所谓任务就是抽象、离散的工作单元(unit of work)。

6.1 在线程中执行任务

       在围绕任务来管理应用程序时,第一步要指明一个清晰的任务边界(task boundaries)。理想情况下,任务是独立的活动:它的工作并不依赖于其他任务的状态、结果或者边界效应(side effect)。

       在正常的负载下,服务器应用程序应该兼具良好的吞吐量和快速的相应性。

       顺序化处理几乎不能为服务器应用程序提供良好的吞吐量或快速的响应性。

6.1.2 显示地为任务创建线程

       为了提供更好的响应性,可以为每个服务请求创建一个新的线程。

       3个主要结论:

1.    执行任务的负载已经脱离了主线程,主循环能够迅速地重新开始等待下一个连接。这使得程序可以在完成前面的请求之前接受新的请求,从而提高响应性。

2.    并行处理任务,这使得多个请求可以同时得到服务。如果有多个处理器,或者处于I/O未完成,锁请求以及资源可用性等任何因素需要阻塞任务时,程序的吞吐哦量会得到提高。

3.    任务处理代码必须是线程安全的,因为有多个任务会并发地调用它。

 

6.1.3 物限制创建线程的缺点

 

6.2 Executor框架

       任务是逻辑上的工作单元,线程是任务异步执行的机制。顺序执行会产生糟糕的响应性和吞吐量,“每任务每线程”会给资源管理带来麻烦。

6.2.3 线程池

       线程池管理一个工作线程的同构池(homogeneous pool),线程池是与工作队列(work queue)紧密绑定的。

     线程池好处

线程池重用存在的线程,而不是创建新的线程,这可以在处理多请求时抵消线程创建、消亡产生的开销。另外一个好处是,在请求到达时,工作者线程通常已经存在,用户创建线程的等待时间并不会延迟任务的执行,因此提高了响应性。通过调整线程池的大小,你可以得到足够多的线程以保持处理器忙碌,同时可以防止过多的线程互相竞争资源,导致应用程序耗尽内存或者失败。

大量互相独立且同类的任务进行并发处理,会将程序的任务量分配到不同的任务中,这样才能真真的获得性能的提升。

    

第7章 取消和关闭

1.1 任务取消

当外部代码能够在活动自然完成前,把它更改为完成状态,那么这个活动被称为可取消的(cancellable)。

       取消一个活动的原因有很多:

1.    用户请求的取消;

2.    现实活动;

3.    应用程序事件;

4.    错误;

5.    关闭;

在Java中,没有哪一种用来停止线程的方式是绝对安全的,因此没有哪一种方式优先用来停止任务。

       一个可取消的任务必须拥有取消资格(cancellation policy),

7.1.1 中断

       特定阻塞库类的方法支持中断,线程中断时一个协作机制,一个线程给另一个线程发送信号量(signal),通知它在方便或者可能的情况下停止正在做的工作,去做其他事情。

       当线程在并不处于阻塞状态的情况下发生中断状态,会设置线程的中断状态,然后一直等到被取消的活动获取中断状态,来检查是否发生了中断。

       调用interrupt并不意味着必然停止目标线程正在运行的工作;它仅仅传递了请求中断的消息。

       对中断最好的理解:它并不会正真的中断一个正在运行的线程;仅仅发出中断请求,线程自己会在下一个方便的时刻中断(这些时刻被称为取消点,cancellation point).

       中断通常是实现取消最明智的选择。

7.1.2 中断策略

       中断策略中最有意义的是对线程级(thread-level)和服务级(service level)取消的规定:尽可能迅速推出,如果需要的话进行清理,可能的话通知其拥有的实体,这个线程已经推出。

       任务不会再自己拥有的线程中执行;他们借用属于服务的线程,比如线程池。

       每一个线程都有自己的中断策略,所以你不应该中断线程,除非你知道中断对这个线程意味着什么。

7.1.3 中断响应

       当调用可用中断的阻塞函数时,有两种处理InterruptedException的实用策略:

1.    传递异常(和可能发生在特定任务的清除时),使你的方法也成为可中断的阻塞方法;

2.    或者保存中断状态,上层调用栈中的代码能够对其进行处理。

只有实现了线程中断策略的代码才可以接受中断请求。通用目的的任务和库的代码绝不应该接收中断请求。

 

7.1.5 通过Future取消

       我们曾经用到过一个抽象体,它可以管理任务的生命周期,异常处理,并有利于取消——Future.

7.1.6 处理不可中断阻塞

       获得锁。如果一个线程在等待内部锁,那么如果不能确保它最终获得锁,并且作出足够多的努力,让你能够以其他方式获得它的注意,你是不能停止它的。

       对于线程持有的服务,只要服务的存在时间大于创建线程的方法存在的时间,那么就应该提供声明周期方法。

       在一个长时间运行的应用程序中,所有的线程都要给未捕获异常设置一个处理器,这个处理器至少要将异常信息记入日志中。

 

7.4 JVM关闭

7.4.1 钩子函数

       关闭钩子函数全部都是并发执行的,关闭日志文件可能引起其他需要使用日志服务的关闭钩子的麻烦。为了避免这个麻烦,关闭钩子不应该依赖于可能被应用程序或其他关闭钩子关闭的服务。

7.4.2 精灵线程

       线程被分为两种:普通线程和精灵线程。JVM启动时创建的所有线程,除了主线程之外,其他都是精灵线程(比如垃圾回收器和其他类似线程)。当一个新的线程创建时,新线程继承了创建它的线程的后台状态,所以默认情况下,任何主线程创建的线程都是普通线程。

       普通线程与精灵线程之间的区别仅仅在于退出时会发生什么。

       应用程序中,精灵线程不能替代对服务的生命周期恰当、良好的管理。

7.4.3 Finalizer

       避免使用Finalizer

c#笔记之mes上传Http协议版 HTTP(超文本传输协议) 是一种典型的协议。 阅读详情

相关推荐

Matlab实战:从零搭建弹道导弹六自由度仿真模型(附完整代码)

本文详细介绍了如何使用Matlab从零搭建弹道导弹六自由度仿真模型,涵盖仿真环境配置、核心运动方程实现、气动力建模及仿真结果分析。通过完整代码示例,帮助读者掌握弹道导弹六自由度仿真的关键技术,适用于航空航天工程和复杂系统建模领域。

x8y9z0的博客 946

《java并发编程实战》笔记(第6章)

大多数并发应用程序都是围绕“任务执行”来构造的 :任务通常是一些抽象的而且离散的工作单元。通过把应用程序的工作分解到多个任务中,可以简化程序的组织结构,提供一种自然的事务边界来优化错误恢复过程,以及提供一种自然的并行工作结构来提升并发性。 在正常的负载下,服务器应用程序应该同时表现出良好的吞吐量和快速的响应性。应用程序提供商希望程序支持尽可能多的用户,从而降低每个用户的服务成本。 大多数服务器应用程

shihengli2010的专栏 352

「转载」vaptcha 等手势验证码图像识别与轨迹提取(思路)

作者:文安哲 从博客重开以后就说要更文章,鸽了蛮久了,赶紧补上一篇嫖嫖各位老公的流量。 最近看群里面大家讨论研究手势验证码比较多,然后我也顺带研究做了一下,给各位老公们分享一下做的过程。 首先,一起来康康手势验证码长啥样! 大概就是长这个样子,需要按照图像中的那条轨迹再图片上滑动,不得不说这类验证码确实体验感拉满,让人很想立马关掉这个网站。 那么言归正传,这类验证码该怎么做识...

AI悦创·编程私教1v1 3597

java并发基础(三)--- 任务执行

第6章开始是第二部分,讲解结构化并发应用程序,大多数并发应用程序都是围绕“任务执行”构造的,任务通常是一些抽象的且离散的工作单元。 一、线程池 大多数服务器应用程序都提供了一种自然的任务边界:以独立的客户请求为边界。现在我们要实现自己的web服务器,你一定见过这样的代码: class SingleThreadWebServer { public static void main...

weixin_30627381的博客 157

时间卷积网络(TCN):结构+pytorch代码

文章目录TCNTCN结构1-D FCN的结构因果卷积(Causal Convolutions)膨胀因果卷积(Dilated Causal Convolutions)膨胀非因果卷积(Dilated Non-Causal Convolutions)残差块结构pytorch代码讲解 TCN   TCN(Temporal Convolutional Network)是由Shaojie Bai et al....

Leon_winter的博客 11万+

Qt 调用YOLO模型(代码)

本文介绍了如何在 Qt C++ 环境中集成 YOLO 模型进行目标检测,包括模型封装、界面设计和实时处理等关键步骤。通过这种方法,你可以快速开发出具有目标检测功能的 Qt 应用程序,应用于监控系统、机器人视觉、图像分析等多个领域。

轩宇的博客 259

[Java 并发] Java并发编程实践 思维导图 - 第六章 任务执行

根据《Java并发编程实践》一书整理的思维导图。希望能够有所帮助。 第一部分: 第二部分: 第三部分:

不忘初心,好好沉淀 5438

高频电磁场仿真-主题064-伴随变量法与灵敏度分析

在电磁器件优化设计中,梯度信息对于指导优化方向至关重要。考虑一个典型的电磁优化问题: 其中 p=[p1,p2,...,pn]Tp = [p_1, p_2, ..., p_n]^Tp=[p1​,p2​,...,pn​]T 是设计参数向量(如几何尺寸、材料参数等)。传统有限差分法的困境:示例: 一个具有100个设计参数的天线优化问题伴随变量法(Adjoint Variable Method, AVM)通过引入伴随场,将梯度计算复杂度从 O(n)O(n)O(n) 降低到 O(1)O(1)O(1):伴随变量法在计算

kkchenjj的博客 410

《Java并发编程实战》第6、7章学习笔记

第五周学习心得 本周进行了《Java并发编程实战》第6、7章的学习,第6章主要通过围绕任务执行来设计应用程序,侧重于对Executor的使用。第7章主要讲了任务、线程和服务的取消与关闭操作带来的潜在问题以及如何避免这些问题。 任务执行——针对Executor的使用 在设计多线程应用程序时,需要明确任务的边界以及选择合理的任务执行策略,以便于更好的进行线程代码的独立编写。 大多数服务器应用程序都提供了一种自然的任务边界选择方式:以用户请求为任务边界。 无限制创建线程的不足: 线程生命周期的开销非常高

weixin_45207474的博客 189

CPD (Coherent Point Drift) 算法实现点云配准 C++版

作为和icp并列的点集配准算法cpd为什么没有icp火,等我把整个方案跑完才明白。 首先下载cpd https://github.com/gadomski/cpd 包含的fgt https://github.com/gadomski/fgt 下载到win10的解压后 运行cmake来进行编译 这个时候会提醒缺少eigen3 fgt python 这几个都安装排除后 在build文件夹下会生成vs2017的源码,右键全部生成后在 .\cpd-master\build\Debug 下会生成一个cpd.li

uranus1992的博客 3510

Yolov5自定义图片训练测试及模型调优(详细过程)

Yolov5自定义数据训练及测试1. 图像数据获取、标注2. 数据集划分及准备3. 配置训练参数,准备训练:3.1 修改data/训练配置xxx.yaml文件:3.2 修改models模型配置xxx.yaml文件4. 开始训练5. 测试训练后的模型: 1. 图像数据获取、标注 如果自定义训练自己的数据集,首先需要数据标注,至于数据来源可以是下载现有的开发数据集、拍照、爬虫等等。 如果是拍照、爬虫等获取的数据图片,需要进行数据标注,这个过程可以使用工具来做,但也需要一些手动操作 。。并且图片越多越好,如果

HowieXue 薛永浩的博客 10万+

Java 并发编程学习笔记

3.锁在同一实例对象上才互斥,monitorenter申请锁,nonitorexit释放锁。作用:放入的线程全部等待消费线程来取(可同时多个线程),事件的及时传递。解决问题:解决某线程写入数据后,接着读取该数据,可能不一致的问题。锁降级:是指在获取写锁后,再获取读锁,然后释放写锁,释放读锁。底层实现:写的时候拷贝数据到新数组,然后设置到新的数组引用。读锁:持有读锁时,其他线程可继续获取读锁,不可获取写锁。写锁:持有写锁时,其他线程不可获取读锁,也不可获取写锁。使用案例:ABC打印问题,可精准通知线程。

freeRoad 1324

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

《java并发编程之美》学习笔记-知识盲点记录

本文总结了近期自己阅读《java并发编程之美》这本书完成8章以后扫描到的很多知识盲区,一些之前没有注意到的点随手记录下来,可以去参考学习一下源码的巧妙设计,深入理解目的、原理和应用场景,以便工作中遇到并发编程需求的时候能够用的上。

互联网大厂后端码农,个人IP:无一郎的技术圈,欢迎加入我的知识星球,解锁更多内容 1357

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

java JUC并发编程 第六章 CAS

java CAS原理,UnSafe原理,AtomicInteger,ABA问题,AtomicStampedReference

记录工作历程 213

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

《java并发编程实战》 第七章 任务、线程的取消与关闭

《java并发编程实战笔记》第七章 任务、线程的取消与关闭任务如何取消通过判断volatile类型的状态量----不一定可靠通过中断-----实现取消最合理方法 第七章 任务、线程的取消与关闭 要使任务和线程安全、快速、可靠的停止下来,并不是一件容易的事情。java没有提供任何机制来安全地终止线程,但提供了中断协作机制,中断能使一个线程终止另一个线程的当前工作。 任务如何取消 任务取消的原因有很多...

乌鸦大大 1180

JAVA课本第六、七章答案

OutputStreamWriter类是Writer的子类,它的作用是将字符流转换成字节流,即将Writer中的数据以字节的形式写入到OutputStream中,同样需要指定字符集。- InputStreamReader类是Reader的子类,它的作用是将字节流转换成字符流,即将InputStream中的数据以字符的形式读出来,需要指定字符集。- ArrayList的增删操作可能涉及到数组的扩容或者元素的移动,这些操作的时间复杂度是O(n),因此相对较慢。1. 字节流,字符流。

2401_87922654的博客 376

《Java并发编程的艺术》笔记

打完

y_mk的博客 416

java JUC并发编程 第七章 原子操作类增强

java原子类操作,AtomicReference,AtomicStampedReference,AtomicMarkableReference,AtomicIntegerFieldUpdataterDemo,AtomicReferenceFieldUpdater,Striped64.

记录工作历程 298

java语言程序设计基础篇第七章编程练习题

1 import java.util.Scanner; public class Main{ public static void main(String[] args){ int maxScore = 0; Scanner input = new Scanner(System.in); int numStudent = input.nextInt(); int[] stude

梦幻的蔷薇色 2万+

重拾并发编程实战(第七章)

文章目录重拾并发编程实战(二)第七章、Hook线程以及捕获线程执行异常7.1 获取线程执行时异常7.2 什么是UncaughtExceptionHandler?7.3 UncaughtExceptionHandler源码分析(执行过程)7.4 注入钩子线程(Hook)7.5 Hook线程实战7.6 小结 重拾并发编程实战(二) 第七章、Hook线程以及捕获线程执行异常 7.1 获取线程执行时异常 在Thread类里面,关于处理运行时异常的API共有4个,如下所示: public void setUncau

LH is programming hard 821

Java并发编程图册

序言很多同学学习Java并发一头扎进源码,最后头破血流,无功而返。横看成岭侧成峰,远近高低各不同。学习要始终从不同的视⻆来看待问题。学习并发亦是如此,需要通过理论远看轮廓,然后通过源码近看明细。本文包含大量图文以及源码分析帮助⼤家理解相关知识,借助这些图文,按照这个顺序学习,至少可以让你简单入门并发。入门后,希望大家继续带着下面这段话坚持深耕并发内容庆幸可以站在巨人的肩膀上学习,整理这些文稿的过程中参考了大量的资料,参考内容不能一一列出,万分感谢前辈们的知识分享如何学并发1.「Java并发编程实战」该书籍是

Firstlucky77的博客 586

每一步操作直击程序员内心,Alibaba出品的Java并发编程实践文档,

前言: Java近些年深受程序员们的喜爱,而线程是Java平台的基石。随着多核处理器成为标准,欲构建高性能的应用程序,有效地利用并发将成为关键的步骤。无论如何,开发、测试、调试多线程的程序仍然非常困难;常见的情形总是开发的并发程序看上去可以正常工作,但是在极端情况下就会失败,就生产环境而言这种情况是指高负载。 而今天分享的GitHub上标星81.6k的Java并发编程实践,以坚实的理论基础和翔实的实践技术,可帮助朋友们构建可靠的、可伸缩的和可维护的并发应用程序。并不是简单地罗列出并发API和机制,相反.

weixin_46794373的博客 130

《Java并发编程的艺术》总结

目录 一、总结 第一章 并发编程的挑战 第二章 Java并发机制的底层实现原理 第三章 Java内存模型 第四章 Java并发编程基础 第五章 锁Lock 第六章 Java并发容器和框架 第七章 原子操作类 第八章 并发工具类 第九/十章 线程池及Executor框架 二、参考资料 一、总结 第一章 并发编程的挑战 第二章 Java并发机制的底层实现原理 第三章 Java内存模型 第四章 Java并发编程基础 第五章 锁Lock 第六章 Java.

爱我所爱0505 282

零基础学Java——第七章:多线程与并发编程(下)

本章补充内容介绍了Java并发编程中的重要组件:线程池、并发集合、原子类和并发工具类。这些工具和类库为开发高效、安全的多线程应用提供了强大支持。 - **线程池**:通过复用线程减少创建和销毁线程的开销,提高系统性能 - **并发集合**:提供线程安全的集合类,避免在多线程环境下使用同步代码块 - **原子类**:提供原子操作,无需使用锁就能保证线程安全 - **并发工具类**:提供多种线程协作工具,简化复杂的多线程交互 掌握这些工具和技术,将使你能够开发出高效、稳定的并发应用程序。

qqxhb 资源共享 1490

《Java并发编程实战》笔记

这个假期读了《Java并发编程实战》,因为暂时没有相关项目的实践所以读来的作用也只是了解居多。这里记录一下阅读过程中的笔记,到后面要用到的时候可以回来看看,再结合这里的总结去翻翻书里相关部分的原文。 文章目录第一部分 基础知识第二章 线程安全性竞态条件Java内置锁重入其他第三章 对象的共享可见性volatile多线程的long和double发布与逸出线程封闭栈封闭ThreadLocal类不变性第四章 对象的组合Java监视器模式为现有类添加原子操作修改这个类扩展这个类客户端加锁机制组合第五章 基础构建模块

F_Arisa的博客 1489

《Java语言程序设计与数据结构》编程练习答案(第七章)(一)

《Java语言程序设计与数据结构》编程练习答案(第七章)(一) 英文名:Introduction to Java Programming and Data Structures, Comprehensive Version, 11th Edition 7.1 import java.util.Scanner; public class book { public static void m...

SWY's Workshop 1万+
上一篇: 《JAVA并发编程实践》学习笔记(第四.五章)
下一篇: 《JAVA并发编程实践》学习笔记(第八.九章)
把酒作清欢
博客等级 码龄15年 17粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值