![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
文章平均质量分 91
程可爱
一入码场深似海,从此头发不复存
展开
-
JAVA多线程进阶篇-Condition和Signal
Condition是JAVA1.5中出现的,它的作用是对原生的wait()、notify()/notifyAll()方法进行增强,相对于传统的wait()和notify()方法,Condition中的await()和signal()这种方式实现线程中协作更加高效。Condition是一个接口,主要依赖于JUC中的Lock接口,它的await()、signal()方法都要在lock同步锁内完成,也就是该部分代码必须存在于lock.lock()、lock.unlock()之间。原创 2022-09-28 22:32:07 · 1822 阅读 · 0 评论 -
JAVA多线程基础篇-AQS(AbstractQueuedSynchronizer)
AQS(AbstractQueuedSynchronizer)抽象队列同步器,是一种用来构建锁和同步器的框架。在JAVA,AQS是其它同步组件的基础框架(ReentrantLock、Semaphore、CountDownLatch、ReentrantReadWriteLock、SynchronusQueue等),它是JUC并发包中的核心组件。它不仅解决了在实现同步器时涉及的大量细节问题(自定义标准同步状态、FIFO同步队列等),还充分考虑了伸缩性,降低了上下文开销、提高了吞吐量。原创 2022-09-26 11:32:53 · 3485 阅读 · 0 评论 -
JAVA多线程进阶篇-探索线程池ThreadPoolExecutor源码
JAVA线程池是一种基于池化思想的线程管理工具,它能够控制线程运行的数量。在线程运行中,线程过多会带来额外的开销,其中包括创建销毁线程的开销,操作系统调度线程的开销等,若频繁创建大量线程、销毁线程,会极大地降低计算机地整体性能。线程池技术能够维护指定数量线程,且根据线程数量安排执行数量。这种做法的优势是降低创建和销毁线程的代价,另一方面避免同一时间创建大量线程导致计算机资源消耗,程序运行异常。本文将分析JAVA线程池的使用及底层实现原理,帮助大家更好地理解该技术。原创 2022-08-23 23:06:19 · 236 阅读 · 0 评论 -
CAS小述
1.概述CAS(Compare And Swap)比较并交换,它是一种乐观锁的实现方式。其作用是让CPU比较内存中某个值是否和预期的值相同,如果相同则将这个值更新为新值,不相同则不做更新,也就是CAS是原子性的操作(读和写两者同时具有原子性),由于其底层是基于C/C++实现,因而具有很高的性能。本文首先会介绍CAS的基本思想以及相关基础知识(乐观锁和悲观锁),其次讲解一个小案例来进一步阐述CAS思想,最后分析CAS源码,让读者对CAS有更进一步的了解。2.基础原理解释2.1 乐观锁(非互斥同步锁)2原创 2021-09-26 22:31:41 · 160 阅读 · 0 评论 -
JAVA多线程基础篇-join方法的使用
join()是Thread类的一个方法,根据jdk文档的定义,join()方法的作用,是等待这个线程结束,即当前线程等待另一个调用join()方法的线程执行结束后再往下执行。通常用于在main主线程内,等待其它调用join()方法的线程执行结束再继续执行main主线程。本文将探索join方法的使用方式和使用原理。.....................原创 2022-07-31 22:46:35 · 8070 阅读 · 0 评论 -
JAVA多线程基础篇-类ThreadLocal
ThreadLocal类是JDK1.2中提供的一个类,它是解决多线程并发程序的一个类。它能够提供线程内的局部变量,使得不同线程之间变量不会相互干扰,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数组件之间一些公共变量传递的复杂度。在大部分场景下,使用ThreadLocal比直接使用synchronized解决线程安全问题更简单和方便,本文将探索ThreadLocal的具体使用方式和底层原理。.................................原创 2022-07-31 22:40:17 · 809 阅读 · 0 评论 -
JAVA多线程基础篇-线程通信(wait/notify)
在JAVA多线程中,线程通信是重要概念之一。线程通信能够使系统之间的交互性更强大,在大大提高CPU利用率的同时还会使程序员对各线程在任务处理过程中进行有效把控。本文将针对使用wait/notify进行线程之间通信进行分析,详述其实现过程、原理以及相关注意事项。.........原创 2022-07-10 20:29:56 · 1868 阅读 · 0 评论 -
JAVA多线程基础篇-关键字synchronized
syncronized是JAVA多线程开发中一个重要的知识点,涉及到多线程开发,多多少少都使用过。那么syncronized底层是如何实现的?为什么加了它就能实现资源串行访问?本文将基于上述问题,探索syncronized的用法及原理。由于本节知识涉及到JMM相关知识,具体可查看上一篇文章JAVA多线程基础篇-关键字volatile。由上表可知,synchronized的具体功能包括:锁方法、锁对象和锁代码块。1.概念一个线程可以多次执行synchronized,重复获取同一把锁。2.案例运行结果如下原创 2022-06-27 19:31:23 · 566 阅读 · 0 评论 -
JAVA多线程基础篇-关键字volatile
1.概述volatile是java多线程中一个常见的关键字,面试中被问的频率也比较高。那么volatile的作用是什么?以及其实现原理是什么?本文将基于上述问题,结合一些具体案例来分析volatile的作用以及实现原理,来帮助大家更好地理解volatile。2.案例分析...原创 2022-05-16 22:33:28 · 1834 阅读 · 0 评论 -
JAVA阻塞队列-ArrayBlockingQueue
1.概述在JAVA中,阻塞队列算起来共有7种(如下图所示)。数组阻塞队列(ArrayBlockingQueue) :底层基于数组的有界阻塞队列,初始化时需要指定队列大小;链表阻塞队列(LinkedBlockingQueue) :以链表来存储元素,理论上只要存储空间够大,就是无界的;同步阻塞队列(SynchronousQueue):队列中不存储元素,队列中放入元素后,只有该元素被消费完成,才能重修放入元素;优先级无界阻塞队列(PriorityBlockingQueue):底层基于数组的无界队列,支原创 2022-02-13 23:26:05 · 5253 阅读 · 0 评论 -
JAVA多线程基础篇--Callable与FutureTask
1.概述2.实战演练3.代码分析4.小结5.参考文献原创 2022-01-20 09:03:40 · 2828 阅读 · 1 评论 -
JAVA多线程基础篇--线程终止(Interrupt与stop)
1.概述日常业务中,可能会遇到这样一个场景:终止一个正在运行的线程。停止一个线程意味着在线程处理完任务之前停掉正在做的操作,也就是放弃当前的操作。优雅地停止线程是java开发中比较重要的技术点,因此需要一些技巧。本文将基于多线程停止的几种方式来进行分析,并对比各种方式的优劣。2.线程停止的几种方法首先要了解JAVA中终止正在运行线程的三种方法:2.1 调用Thread.stop()方法来强行终止线程这种方式是不被推荐的,因为stop()、suspend()与resume()都是作废过期的方法,使用原创 2021-12-20 13:59:55 · 2209 阅读 · 0 评论 -
JAVA多线程基础篇--守护线程(Daemon Thread)
1.概述JAVA中的线程主要分为两类:用户线程(User Thread)和守护线程(Daemon Thread)。JAVA语言中无论是线程还是线程池,默认都是用户线程,因此用户线程也被称为普通线程。守护线程也被称之为后台线程或服务线程,守护线程是为用户线程服务的,当线程中的用户线程都执行结束后,守护线程也会跟随结束。守护线程具有自动结束生命周期的特性,而非守护线程则不具备该特性。本文将编写一些案例,同时根据源码来对用户线程和守护线程进行分析,帮助大家更好地理解。2.守护线程分析2.1 案例分析上面讲原创 2021-12-16 20:08:51 · 9406 阅读 · 2 评论 -
Semaphore小述
1.概述Semphore(信号量)是一种线程同步工具,它主要用于多个线程对同一个资源进行并行操作,合理并发占用有限的公共资源。Semaphore可以理解为管理一组数量固定许可证的机构,当有大量线程来请求资源时,Semaphore会给一部分线程许可证,拿到许可证的线程才能访问资源,访问结束后归还许可证给Semaphore,Semaphore继续将证书发给排队的一个个线程;使用Semaphore可以控制并发资源的线程个数。本文将通过案例对Semaphore进行演示,并通过源码进行分析,从而全面展示Semaph原创 2021-12-07 17:14:12 · 742 阅读 · 0 评论 -
CountDownLatch小述
1.概述countDownLatch是一个多线程同步工具类,这个工具经常用来用来协调多个线程之间的同步,能够实现线程之间的通信(协作式、非互斥)。它能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。它相当于是一个计数器,这个计数器的初始值就是线程的数量,每当一个任务完成后,计数器的值就会减一,当计数器的值为 0 时,表示所有的线程都已经任务了,然后在 CountDownLatch 上等待的线程就可以恢复执行接下来的任务。本文将从源码来分析countDownLatch的实现原理,并通过一个小案例原创 2021-09-08 21:15:20 · 293 阅读 · 0 评论 -
CyclicBarrier小述
1.概述CyclicBarrier是JUC包中一个同步工具类,它能够保证一组线程相互等待,直到所有线程到达同一屏障点,再进行下面的操作。本文将通过剖析CyclicBarrier源码以及分析其使用场景,来进一步展示CyclicBarrier。2.CyclicBarrier原理解析2.1 构造方法 public CyclicBarrier(int parties, Runnable barrierAction) { if (parties <= 0) throw new I原创 2021-08-31 14:45:45 · 107 阅读 · 0 评论 -
多线程从入门到放弃之线程统计结果方案
1.概述基于上文《Redis从入门到放弃之Redis key过期监听》中的应用实例中,无法进行大批量数据的上报。因此决定采用多线程来进行解决,给每台设备单独开启一个上报线程,同时指定线程开关,能够跟据需要来关闭线程,设备的配置信息放置于缓存中,每次处理完成数据后,重置下一次的处理时间,进而达到定时上报的效果。本文将基于上述思路,进行业务实现解决。2.方案实现2.1 方案一方案一的实现思路如下:跟据每台设备的唯一标识(设备号)开启一个线程,该线程会不断去获取缓存中的配置,配置中包含该条设备下一次的上原创 2021-03-24 20:12:25 · 252 阅读 · 0 评论 -
JAVA多线程基础篇(一)
1.概述在学习java多线程之前,首先需要了解进程和线程的概念,具体阐述如下:(1)进程指的是一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间。例如在windows程序中,一个.exe程序就是一个进程。(2)线程线程在进程下行进,一个进程至少有一个线程,不同进程之间资源难以共享,同一进程下不同线程可以进行数据共享。(3)进程与线程区别进程与进程之间一般不会相互影响,但线程的运行会影响其父进程,一旦某个线程挂掉,可能会影响整个进程。2.多线程原理(1)一个简单的多线程例子(原创 2020-06-29 22:52:11 · 210 阅读 · 0 评论