Java并发原理
文章平均质量分 76
jysf98746
这个作者很懒,什么都没留下…
展开
-
二十二、锁支持工具 LockSupport
本节带领大家认识第三个常用的 Java 并发锁工具之。本节先介绍工具类的用途,然后介绍关键的编程方法,最后通过一个编程例子为大家展示工具类的用法。下面我们正式开始介绍吧。原创 2023-10-26 08:47:47 · 36 阅读 · 0 评论 -
二十一、读写锁 StampedLock
本节带领大家认识第二个常用的 Java 并发锁工具之。本节先简单介绍的基本概念,然后介绍关键的编程方法,最后通过一个编程例子为大家展示工具类的用法。原创 2023-10-26 08:45:33 · 24 阅读 · 0 评论 -
二十、可重入读写锁 ReentrantReadWrite
从本节开始,我们学习新一章内容 —— 并发锁。在 “Java 并发原理教程” 中,介绍了锁相关概念和原理知识,本章各小节内容不再过多解释概念,重点为大家介绍具体锁工具的 API 和使用方法。本节带领大家认识第一个常用的 Java 并发锁工具之。本节先简单介绍的基本概念,然后介绍关键的编程方法,最后通过一个编程例子为大家展示工具类的用法。下面我们正式开始介绍吧。原创 2023-10-26 08:40:52 · 31 阅读 · 0 评论 -
十九、ForkJoin 应用示例
首先做了 (0,3)~(3,6),之后对 (0,3) 做了 (0,1), (1,3) 的拆分,对 (3,6) 做了 (3,4), (4,6)其底层使用多线程的方式处理任务,涉及到线程上下文的切换,当数据量不大的时候使用串行会比使用多线程快。上面代码注释已经很清楚了,我们观察下面的代码,看看任务是怎么切分的,以及子任务的结果是怎么做汇总的。当待处理的数据集的每一部分的数据处理逻辑基本一致,且可以很好拆分成小的数据集进行处理时,使用。本节先描述待实现的案例内容,接着做编码实现,然后总结使用过程中的注意事项。原创 2023-10-23 10:33:21 · 46 阅读 · 0 评论 -
十八、ForkJoin 并发框架介绍
框架的基本思想是将一个大任务拆分成多个处理逻辑相同的子任务,最后将这些子任务的结果再汇总起来,从而得到大任务的结果。即在任务处理时,先进行任务切分,然后进行切分后的各子任务的计算,最后做结果合并。一般我们只需要根据实际情况,选择继承上面的两个子类之一,然后实现自己的逻辑就可以了。并发框架实现一个综合例子,让大家从整体概念、接口实现、应用有一个较全面的了解。并发框架的整个体系结构,接着介绍各部分中的核心接口和实现类,下一节中使用。整体结构已经了解了,接着我们继续了解各部分的核心接口和实现类。原创 2023-10-23 10:30:59 · 20 阅读 · 0 评论 -
十七、Executor 应用示例
我们可以通过手工创建线程做逻辑单元的执行,但是当存在大量的需要执行的逻辑单元也是这样处理,就会出现很多麻烦的事情,且效率非常低下。手工创建线程并做线程管理,需要我们实现很多与业务无关的控制代码,另外手工不停的创建线程并做线程销毁,会浪费很多系统资源。我们在实际项目中,常常通过使用 java 提供好的非常好用的线程框架 Executor 进行任务执行操作。本节先描述待实现的案例内容,接着做编码实现,然后总结使用过程中的注意事项。上面代码注释已经很清楚了,我们观察下面的代码,看看任务代码。原创 2023-10-22 20:49:34 · 28 阅读 · 0 评论 -
十六、Executor 并发框架介绍
并行框架对工作单元、以及工作单元的执行做了高度抽象,形成了一整套完整模型。并发框架实现一个综合例子,让大家从整体概念、接口实现、应用有一个较全面的了解。任务的执行机制,即如何组织任务的提交、如何管理提交的任务、如何组织多个线程执行。并发框架的整个体系结构,接着介绍各部分中的核心接口和实现类,下一节中使用。对任务执行结果的抽象,即如何跟踪任务执行状态,如何获取任务执行结果。整体结构已经了解了,接着我们继续了解各部分的核心接口和实现类。的唯一实现类,其职责是提供方便地构建带有返回结果的任务。原创 2023-10-22 20:08:05 · 25 阅读 · 0 评论 -
十五、阻塞队列 BlockingQueue
我们举一个生活中汽车排队加油的例子说明:每一个加油站台就是一个阻塞队列,汽车依次排队进入,先进入的先出站。当站台满了后继车辆就需要排队等待,当前面的汽车加好油离开(出队)后,后面的汽车进入(入队)开始加油。首先作为一个队列,可以适用于任何需要队列数据结构的场合,其次其具有阻塞操作的特征,可用于线程间协同操作的场合。在计算机中,队列具有先入先出的特征,不允许插队的情况出现。等,这些实现类之间主要区别体现在存储结构或元素操作上,但入队和出队操作却是类似的。工具类的使用场合,然后通过简单的编码实现此场景。原创 2023-10-22 20:04:37 · 26 阅读 · 0 评论 -
十四、写时复制的CopyOnWriteArrayList
因为采用了写时复制的实现原理,当存在大量写的时候,内存中会频繁复制原有数据的副本,如果原有数据集很大,则很容易造成内存飙升甚至内存异常。我们举一个 IP 黑名单判定的例子:当应用接入外部请求后,为了防范风险,一般会对请求做一些特征判定,如对请求 IP 是否合法的判定就是一种。顾名思义,就是 “写数据的时候先拷贝一份副本,在副本上写数据”。方式,可以做到读操作不用加锁,而只对写操作加锁,且可以很方便地反馈写后的结果给到读操作。工具类的使用场合,然后通过简单的编码实现此场景。观察结果,和我们的预期一致。原创 2023-10-19 09:15:21 · 35 阅读 · 0 评论 -
十三、线程安全的 ConcurrentHashMap
此场合下统计结果是多个键值对,键是单词,值是字母出现的总次数,采用。如果 key 对应的当前值是 oldValue,则替换为 newValue,返回 true。,是仅仅因为其安全,相比全局加锁的方式而且很高效,还有很多已经提供好的简便方法,不用我们自己再另行实现。如果 key 对应的值是 value,则移除 K-V,返回 true。翻译过来是并发的意思,字面理解它的作用就是提供并发情况下的。工具类的使用场合并通过简单的编码实现此场景,最后介绍。的升级,采用了分段加锁而非全局加锁的策略,增强了。原创 2023-10-19 09:11:30 · 27 阅读 · 0 评论 -
十二、交换者 Exchanger
我们举一个生活中的例子说明:快递员为客户派送物品,客户要求订单采用货到付款的方式进行支付。在这个例子中,快递员交换出去的是货物收到的是款项,而客户正好相反。允许设置交换等待的超时时间,当时间过后还未交换到需要的对方数据,则不再等待,继续后继逻辑执行。表示 “交换者”,此工具类提供了两个线程在某个时间点彼此交换信息的功能。工具类表达的概念和最基本用法,接着通过一个生活中的例子为大家解释。工具类的使用场合,然后通过简单的编码实现此场景,最后带领大家熟悉。方法,除过上面代码中使用的方法之外,其还对进行了重载。原创 2023-10-18 20:33:59 · 30 阅读 · 0 评论 -
十一、移相器 Phaser
适合用于具有多阶段处理的任务,在每个阶段有多个线程并行处理的场景。这样描述很抽象,我们举一个生活中的例子:有一个开发小组总共 4 个人,约定一起去旅游。这个工具类相对而言比较复杂,大家不要着急,结合后面的案例仔细体会。上述代码在注册好需要同步控制的所有线程之后,开启了每一个线程(每位同事)的处理。是不是又强大又抽象,没关系,我们通过一张图可以直白了解其提供的逻辑模型。工具类表达的概念和最基本用法,接着通过一个生活中的例子为大家解释。工具类的使用场合,然后通过简单的编码实现此场景,最后带领大家熟悉。原创 2023-10-18 20:31:13 · 102 阅读 · 0 评论 -
十、循环栅栏 CyclicBarrier
工具类允许一组线程相互等待,直到所有线程都到达一个公共的屏障点,然后这些线程一起继续执行后继逻辑。之所以称之为 “循环”,是因为在所有线程都释放了对这个屏障的使用后,这个屏障还可以重新使用。这样描述很抽象,我们还是举一个生活中的例子说明:某学习班总共 5 位同学,约定周末一起乘坐大巴出游,约定了共同的集合地点,雇佣了 1 位司机。除过上面代码中使用的最基本的 await () 方法之外,还有下面几个方法大家可以了解一下。工具类的表达的概念和最基本用法,接着通过一个生活中的例子为大家解释。原创 2023-10-16 09:17:53 · 72 阅读 · 0 评论 -
九、同步计数器 CountDownLatch
工具类从字面理解为 “倒计数锁”,其内部使用一个计数器进行实现,计数器初始值为线程的数量。当每一个线程完成自己的任务后,计数器的值就会减一。当计数器的值为 0 时,表示所有的线程都已经完成了任务,然后在。比如我们制作一张复杂报表,报表的各部分可以安排对应的一个线程进行计算,只有当所有线程都执行完毕后,再由最终的报表输出线程进行报表文件生成。工具类表达的概念和最基本用法,接着通过一个生活中的例子为大家解释。工具类的使用场合,然后通过简单的编码实现此场景,最后带领大家熟悉。提供的多线程共同协作的模型。原创 2023-10-16 09:13:09 · 52 阅读 · 0 评论 -
八、计数信号量 Semaphore
当某个时刻有乘客需要使用闸机过站时,首先他需要找到一台没有人使用的闸机,现实中他通过眼睛观察即可知道,在我们程序里面就是需要观察信号量,看能不能申请到代表可用闸机的信号量,如果能则表示有空闲闸机 (资源) 可用,否则需要等待其他乘客使用完毕 (信号量释放)后再使用。上图中的乘客就类比是我们程序里面的各类线程,闸机就类比是一类线程需要使用的资源,而信号量就是某一时刻可用的闸机数量。工具最常用的场合说明,然后通过简单的编码实现文中提到的生活案例,让大家有一个理性的认识,之后带领大家熟悉。原创 2023-10-16 09:08:58 · 43 阅读 · 0 评论 -
七、本章小结
每一个工具类介绍了基本的用法,并且搭配了编程案例。在介绍每一类工具类时,没有过多地做彼此之间的对比,为了大家有一个更深刻的认识,下面总结这些工具类之间的应用差异。JDK 提供了这么多原子操作工具类,且这些工具类在功能上或多或少有重叠,我们该怎么加以选择使用呢?至此本章介绍完毕了,希望大家能反复琢磨,反复练习,争取早日掌握,早日体会到这些工具类带来的便捷。通过前面几个小节的学习,相信大家已经掌握了不少知识和技巧,本节我们一起做一个回顾总结。本章总共 4 个小节,介绍了 4 个典型的原子操作类,分别是。原创 2023-10-14 22:58:26 · 27 阅读 · 0 评论 -
六、原子操作之LongAccumulator
一些简单的累加计算可以直接使用我们之前课程中介绍的工具类,但是当运行规则比较复杂或者 JDK 没有提供对应的工具类时,可以考虑。对象表示统计结果,然后创建了 30 个商场入口检测设备模拟检测识别,接下来每个检测设备如何动作呢,看下面的代码。还能自定义计算规则,比如做乘法运行,或其他任何你想要的计算规则。这样描述是不是有点抽象,别着急,看下面的图示。工具类实现上一节中的生活实例,为了简化叙述,本节我们只统计男性客户总数量。工具类最常用的场合说明,然后通过简单的编码实现一个实际案例,最后带领大家熟悉。原创 2023-10-14 22:51:55 · 59 阅读 · 0 评论 -
五、原子操作之DoubleAdder
工具类采用了 “分头计算最后汇总” 的思路,避免每一次(细粒度)操作的并发控制,提高了并发的性能。所谓细粒度的同步控制,指的是对待同步控制对象的每一次操作都需要加以控制,这样描述是不是有点抽象,别着急,看下面的图示。在统计过程中,每一个线程只需要累加自己的那份统计结果,所以不需要做同步控制,只要在最后进行汇总统计结果时做同步控制进行汇总即可。工具类最常用的场合说明,然后通过简单的编码实现一个实际案例,让大家有一个理性的认识,最后带领大家熟悉。,用法大同小异,希望大家在日常研发中多比较多总结,早日掌握之。原创 2023-10-14 22:47:24 · 40 阅读 · 0 评论 -
四、原子操作之 AtomicReference
引用就是为对象另起一个名字,引用对象本身指向被引用对象,对引用对象的操作都会反映到被引用对象上。包中还提供了更多更细场景的原子操作类,此包下的大部分工具类都是基于 CAS 原理实现,正因为如此,有很多相似之处,用法大同小异,希望大家在日常研发中多比较多总结,早日掌握之。工具类实现生活中汽车牌照竞拍的例子:假设总共有 10 位客户参与竞拍,每位客户只有一次竞拍机会,竞拍是资格竞拍不以竞拍价格为目的。则是对普通的对象引用的封装,可将多个变量作为一个整体对象,操控多个属性的原子性的并发类。原创 2023-10-13 10:25:21 · 350 阅读 · 0 评论 -
三、原子操作之AtomicInteger
在 java 中,当我们在多线程情况下,对一个整型变量做加减操作时,如果不加任何的多线程并发控制,大概率会出现线程安全问题,也就是说当多线程同时操作一个整型变量的增减时,会出现运算结果错误的问题。第 1 个方法是先获取值,之后再对原值做增 1 操作,注意获取的值是变更之前的值。在这个包下面,还有很多类似的工具类,也是对基本类型原子操作的封装,如。大家记住,在多线程并发下,所有不是原子性的操作但需要保证原子性时,都需要进行原子操作处理,否则会出现线程安全问题。所谓原子操作,就是一个独立且不可分割的操作。原创 2023-10-13 10:19:27 · 166 阅读 · 0 评论 -
二、操作系统的并发
为了避免长时间的线程等待,我们一方面提升硬件指标(如多级高速缓存的诞生,这里不做讨论),另一方面引入了并发概念,充分的利用处理器(CPU)的每一个核,减少 CPU 资源等待的时间,以达到最高的处理性能。官方定义: 线程是操作系统能够进行资源调度的最小单位,它被包含在进程之中,是进程中的实际运作单位,每个线程执行的都是进程代码的某个片段,特定的线程总是在执行特定的任务。我们首先来看看,三者之间的关系,从图中可以看到,操作系统是包含多个进程的容器,而每个进程又是容纳多个线程的容器。并发:穿插执行,减少等待。原创 2023-10-12 17:52:55 · 42 阅读 · 0 评论 -
一、并发编程简介
尤其是大数据时代的来临,高并发更成为了家常便饭,工作中,你总是绕不开并发编程的任务,比如说,你想写个程序,一边从文件中读取数据,一边还要做实时计算…在开始学习并发编程之前,学习者需要掌握 JavaSE 的知识,这是学习并发编程的语言基础,也是 Java 程序员必备的基本功。可以这样来说,在目前开发市场对于程序员的硬性要求中,并发编程占据了重要的位置,不懂并发编程的从业者不是一名合格的软件工程师。作为本专题的第一个小节,我们先来了解下什么是并发编程,以及学习并发编程的必要性,及学习过程应该注意的事项。原创 2023-10-12 17:43:04 · 23 阅读 · 0 评论