近段时间重温了java的并发,发现还蛮有意思的,现在总结一下大体的流程吧!
1、 为什么要并发
当计算机在处理应用的过程中,CPU、内存等并不是处于最佳状态(动力十足全力前进),这难免就会造成资源的浪费;在计算一个高精度高复杂性的科学计算时,就需要更快的处理速度,单线程有时会独木难支;在越来越丰富的界面化的应用中,用户的体验度就包括程序的响应速度,而单线程的程序显然难以达到要求。
2、共享对象的安全
在并发过程中,很多时候会用到线程间的通信,或者某个任务是由线程间的协作完成的,比如生产者/消费者问题,这时候,对于这种共享于两个或多个线程间的对象,就需要保证其“安全”。安全的定义其实很简单,那就是某个线程对共享对象的修改是可见的。在JAVA的定义中,为了提供更高的速度,是允许线程保存对象的复本的,只有在进入和离开同步代码块时,才会与原对象进行同步。
如何保证共享对象的安全呢,可以有以下方式:
1> 共享对象的安全也即共享对象的状态属性安全,可以通过
A> Volatile定义变量
B> 使用automic原子变量类
C> 将属性设为只读的final
D> 在属性的更改方法中使用synchronized
E> 在属性的更改方法中使用lock
注1:volatile定义的变量会直接从内存中读取并在修改后立即写回内存,禁止了java虚拟机对代码的优化,此类对象提供的读写均为原子操作,但自增操作等此类复合操作并非原子操作,不能保证该变量的安全。使用条件:新值不依赖之前的旧值,不依赖其它的状态变量,不需要放在synchronized等锁中。
注2:automic原子变量类在long,double等操作时有重要意义,对于64位的long,double类型数据写入时,会分别写入高位与低位,两次写入可能会导致安全问题。
注3:synchronized的锁其锁定的对象为
注4:Lock 其实现类ReentrantLock提供了可定时的可轮询的可中止的锁,但该锁是显示的,即需要手动加锁与解锁。
2> 还可以通过其它方法实现,比如使用ThreadLocal,或者将对象用作线程独占的不作为共享对象使用,或者使用线程安全的Collection。
注:ThreadLocal为每一个使用该变量的线程都提供一个变量值的副本,使每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突,使用put,get来存取。
3、线程的建立
1> 创建线程的方式
A> 实现Runnable接口,将执行代码块放入run方法中。
B> 继承Thread类,重写run方法。
C> 实现Callable接口,并实现call方法,该接口是用于有返回值的线程。
2> 启动线程的方式
A> 实现Runnable接口的类可以使用
1. 以Runnable接口类的实例去实例化一个Thread对象,并调用该对象的start方法
2. 实例化一个Executor的实现子类:
a) Executor.newCachedThreadPool 缓存0到无穷多个线程,用则建不用则毁
b) Executor.newFiledThreadPool 缓存min到max 个线程,自动管理个数
c) Executor.newScheduleddThreadPoolExecutor 可以定时执行,只支持相对时间
执行executor.execute(Runnable)
B> 继承Thread类的线程类,可以直接调用start方法启动线程
C> 实现Callable接口的类需要使用Executor框架的子类,并调用submit方法来启动,在启动后会返回一个Future对象,该对象可以判定线程的状态:isDone,isCanneled,使用get方法取出线程的返回值。
4、线程的结束
1> 设置结束状态位,在执行过程中不断监测该状态位的值,符合退出条件即退出。
2> 使用异常结束,使用interrupt异常结束,这个异常在结束即将进入阻塞或已经阻塞的时候会立即执行,在正常运行时不会执行,但会对interrupted状态位置值,所以可以不断的监测该状态,并使用try-catch-finally块包围,在finally中释放相关资源。
5、线程的异常处理
异常是不会跨线程传递的。
1> 在线程中或线程外捕获RuntimeException,加以处理
2> Thread类可以设置setUncaughtExceptionHandler做异常处理
6、线程的协作
有时候,线程之间是相互配合操作的,比如生产者/消费者,所以就需要线程之间进行协作。线程之间的协作一般可以通过以下方式进行:
1> 使用Object对象中的wait、notify、notifyAll进行
2> 使用Condition对象中的await、signal、signalAll进行
3> 使用线程的协作组件
7、线程的协作组件
线程中会有协作,比如生产者/消费者,以下是一些协作的组件
1> CountDownLatch典型的应用场景是:有一个任务想要往下执行,但必须要等到其他的任务执行完毕后才可以继续往下执行。在初始化时设置一个countDown值,该值一经设定不可改变,当后继任务需要前驱任务的结果时,需要await,当countdown的值为0时,则await的线程会被唤醒并执行。
2> CyclicBarrier允许一组线程互相等待,直到到达某个公共屏障点。典型的应用场景是:是水运中的分段转运法,它使任务在完成某一阶段时进行await,当所有的任务均进入await状态时,即进入下一阶段的运行。
3> DelayBlokingQueue 存放的是一组实现了Delay接口的对象,因为Delay继承了Comparable接口所以Delay的实现类必须重写compareTo方法,其中delay时间最长的也即最紧急的放在队列头,依次以delay时间排序。这是一个阻塞式的队列。
4> PriorityBlockingQueue 是具有优先级的队列,其中的对象也必须实现Comparable接口,也是阻塞式的队列。
5> Semaphore 更像是一个厕所,进入足够多的人后就不允许再进入了,每次进入都必须获取通告证acquire,当出来后则需要交还通告证release。
6> Exchanger 提供两个线程间直接交换对象的方法,这样可以使用对象在线程为为独占的,当使用完成后调用exchange方法将当前任务挂起,等另一个任务也执行此方法时进入对象的交换,交换完成后双方任务自动继续执行。
哈哈,总结的有点太概括了,回头再弄分述下

- 大小: 15.6 KB
分享到:
相关推荐
华为面试题目可能涉及以上多个领域的知识点,因此,准备面试时应全面学习,深入理解每个领域的基本概念,并通过实践提高应用能力。同时,注意关注最新的技术动态和技术趋势,以展现自己对行业发展的敏感度和前瞻性。
在并发控制方面,推荐使用`synchronized`关键字和`volatile`修饰符来保证多线程环境下的数据一致性。 泰山版则是在华山版基础上的升级和完善,增加了更多关于微服务、云计算、大数据等现代Java开发场景的指导原则。...
为能和大家能共同探讨"设计模式",我将自己在学习中的心得写下来,只是想帮助更多人更容易理解 GoF 的《设计模式》。由 于原著都是以C++为例, 以Java为例的设计模式基本又都以图形应用为例,而我们更关心Java在中间件等...
AIGC_基于ControlNet的AI视频生成算法_支持动漫+写实风格转换_附项目源码+流程教程_优质项目实战
app开发
毕业设计指南-word
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
信息收集思维导图
内容概要:本文详细介绍了三维偏微分方程组的数值解法及其一阶近似的推导过程。首先,针对定义在一个三维立方体域上的六个耦合偏微分方程组,选择了有限差分法(FDM)作为数值求解的方法。文中提供了详细的离散化步骤、边界条件设定以及迭代求解的具体实现,并附带了完整的Python代码用于求解和可视化结果。其次,通过对六个方程的线性组合,推导出了一阶近似方程,证明了在特定条件下,系统的演化可以由一个扩散方程来描述。最后,对不同参数σ下的数值结果进行了分析,展示了不同σ值对解的影响。 适合人群:具备数学建模和编程基础的研究人员和技术爱好者,尤其是对偏微分方程数值解感兴趣的学者。 使用场景及目标:适用于需要解决复杂物理现象模拟的问题,如流体力学、热传导等领域。通过学习本文,读者能够掌握有限差分法的基本思想和应用技巧,同时理解如何利用Python进行科学计算和数据可视化。 其他说明:本文不仅提供理论推导,还给出了具体的代码实现,便于读者理解和复现实验结果。此外,文中涉及的可视化部分可以帮助直观地展示数值解的特点和变化趋势。
大数据项目深度研究分析报告.docx
对于WIN11系统连接共享打印机出现提示:windows无法连接到打印机,请检查 打印机名并重试,以及“操作无法完成(错误 0x00000709)”等提示进行解决。
内容概要:本文详细介绍了Docker的重要概念、常用指令及其应用场景,旨在帮助初学者快速掌握Docker的使用方法。主要内容涵盖镜像和容器的概念区分、镜像的获取方式(网络拉取、本地加载)、镜像的使用(查看、创建容器、删除)、容器的管理(进入、退出、停止、删除)、镜像的生成(自动构建、手动提交)以及镜像的分享(在线存储库、本地导出)。此外,还涉及了无用数据的清理和一些常用的可视化管理工具。 适合人群:对Docker感兴趣的初学者,尤其是希望快速上手并应用于实际项目的开发人员。 使用场景及目标:适用于需要快速搭建一致运行环境、进行应用部署和维护的技术团队。通过学习本文,读者能够独立完成Docker环境的搭建、镜像和容器的管理,从而提高开发效率和环境一致性。 其他说明:文中提供了丰富的实例和官方文档链接,便于读者深入理解和实践。同时,附带了一些实用的参考资料,方便进一步探索Docker的高级特性。
矢量边界,行政区域边界,精确到乡镇街道,可直接导入arcgis使用
内容概要:本文详细介绍了动态综合评价中的无量纲化方法,并提供了Python代码实现。主要内容包括:数据准备、静态无量纲化方法(极差法、Z-score标准化、均值法)、三种动态无量纲化改进方法(标准序列法、全序列法、增量权法)。文中还进行了结果分析与比较,得出了全序列法是最推荐的方法,因其能够同时保留横向和纵向信息。最后,文章展示了如何将这些方法应用于TOPSIS综合评价系统,以及如何通过熵权法计算权重。 适合人群:具备一定数据分析和编程基础的研究人员、数据科学家、工程师。 使用场景及目标:适用于需要对多维时序数据进行无量纲化处理和综合评价的场景,如生产质量监控、供应商评估等。目标是帮助用户理解和实现动态综合评价中的无量纲化方法,提高数据处理和分析能力。 其他说明:本文不仅提供了详细的代码实现,还通过实例验证了不同方法的效果,确保读者能够深入理解每种方法的特点和应用场景。
腾讯AI封装调用
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
内容概要:本文详细介绍了A*算法的传统框架及其在路径规划中的局限性,并提出了多项改进措施。首先,针对启发函数进行了优化,引入了基于机器学习的预测方法以及动态权重调整,使得路径更加智能化和平滑化。其次,在邻接表和优先队列方面采用了更高效的数据结构,提高了算法的执行效率。实验结果显示,改进后的A*算法不仅缩短了路径长度,还显著降低了运行时间和空间开销。此外,作者对比了多种常见路径规划算法(如Dijkstra、RRT),展示了改进A*算法在不同场景下的优越性能。 适合人群:从事机器人导航、自动驾驶、游戏开发等领域研究的技术人员,尤其是对路径规划算法有一定了解并希望深入探索优化方法的研究者。 使用场景及目标:①需要在二维或三维环境中进行高效路径规划的应用场合;②希望通过优化现有算法来提升系统性能的研发团队;③希望掌握更多关于路径规划理论和技术细节的学习者。 其他说明:文中提供了具体的MATLAB代码片段用于解释各个部分的具体实现方式,并分享了一些实用技巧,如优先队列的容器映射实现和动画绘制优化等。
app开发
网络工程师(中级)是软考(计算机技术与软件专业技术资格考试)的一部分,主要考察计算机网络基础、网络安全、网络管理、操作系统、数据库等内容,考试分为上午的基础知识选择题和下午的案例分析题。
IoT最新进展