JUC
文章平均质量分 94
java并发包中的多线程工具类
翟小江
这个作者很懒,什么都没留下…
展开
-
JUC-CountDownLatch源码分析
建议阅读CountDownLatch源码分析之前,,了解一下CountDownLatch用处以及基本用法。我们知道CountDownLatch是一个同步工具类,表示允许一个或者多个线程来等待其他的线程来完成它们的操作后,才继续执行自己的操作。.........原创 2022-07-24 22:42:29 · 290 阅读 · 0 评论 -
JUC-Semaphore源码分析
建议阅读Semaphore源码分析之前,先阅读,了解一下Semaphore用处以及基本用法。我们知道Semaphore是一个信号量,在java并发编程中,Semaphore本质上是一个共享锁的,用来限制多线程对共享资源的并发访问的。......原创 2022-07-24 22:07:31 · 291 阅读 · 1 评论 -
JUC-ReentrantReadWriteLock锁源码分析
1.ReentrantReadWriteLock类结构图1.1 ReentrantReadWriteLock的构造方法1.2 ReentrantReadWriteLock的成员变量的作用及其内部类中成员变量的作用。1.3 ReentrantReadWriteLock有两把锁,读锁跟写锁,但是只有一个state变量,那么怎么用一个state变量来同时代表两把锁呢?2. 读锁readerLock源码2.1 获取读锁2.1.1 tryAcquireShared方法源码2.1.2 readerShou原创 2022-07-24 18:50:18 · 254 阅读 · 0 评论 -
AQS之hasQueuedPredecessors方法源码分析
AQS之hasQueuedPredecessors方法源码分析 为什么先读取tail,再读取head hasQueuedPredecessors方法false的情况 hasQueuedPredecessors方法true的情况原创 2022-07-17 16:03:17 · 569 阅读 · 0 评论 -
JUC-ReentrantLock锁源码分析
ReentrantLock源码,lock和unlock源码分析原创 2022-07-16 21:50:03 · 395 阅读 · 0 评论 -
JUC-CyclicBarrier源码分析
CyclicBarrier可以建立一个循环屏障,这个屏障可以阻塞一个线程直到指定的所有线程都达到屏障。就大巴车等乘客,只有所有的乘客都到了,大巴车才可以出发。它可以实现让一组线程互相等待共同到达某个状态之后再全部同时执行,叫做“循环”是因为CyclicBarrier可以被重复使用。具体用法举例可以参考ReentrantLock用法可以参考AQS的Condition源码可以参考。...............原创 2022-07-15 23:39:29 · 204 阅读 · 0 评论 -
JUC-AQS的Condition之await和signal源码解析
JUC-AQS原理篇JUC-AQS源码篇我们知道在AQS源码中用lock和unlock可以用来解决并发中的互斥问题。那么AQS的Condition是干啥的呢?Condition主要是用来解决线程之间的同步问题,类似于实现了线程之前的通信。当某个条件满足时,执行某个线程自己的操作。当条件不满足时,调用await方法将当前线程放入到Condition的条件队列中挂起。当这个条件满足了,其他的线程调用signal方法,将挂起的线程从条件队列中转移到同步队列中,让这个线程唤醒。Condition的await方法、s原创 2022-07-14 00:19:50 · 1186 阅读 · 0 评论 -
JUC-AQS源码篇
上一篇讲了AQS的实现原理这一篇讲讲AQS的的具体源码实现AQS这个抽象类中的代码其实主要就是干了两件事,一个是获取锁,另一个就是释放锁了。获取锁:主要就是调用由AQS子类来实现的能不能获取到锁的方法,如果获取到了,则当前线程接着执行它后面的代码,如果获取失败了,则就将当前线程放入到同步队列中阻塞住,等待其他的释放锁的线程来把它唤醒。获取锁的大致方法调用链如下:共享锁:排他锁(独占锁):上面的acquireShared(arg)方法和acquire(arg)方法是获取锁的入口代码,由具体AQS的子类原创 2022-07-12 23:40:28 · 368 阅读 · 0 评论 -
JUC-AQS原理篇
AQS全称是AbstractQueuedSynchronizer,这个抽象类是java并发包java.util.concurrent.locks(JUC)中的核心,它是JUC包下面多个组件的底层实现。比如CountDownLatch,Semaphore,CyclicBarrier,ReentrantLock,ReentrantReadWriteLock,ThreadPoolExecutor等的底层实现都用到了AQS。简单来讲,AQS是一个抽象类,这些组件的共性功能,它实现了,差异化的功能,它提供接口,由具体原创 2022-07-08 14:56:05 · 470 阅读 · 0 评论 -
JUC-ReentrantReadWriteLock锁基础篇
ReentrantReadWriteLock是一种读写锁,它与ReentrantLock的用法才不多,那么为啥还要有读写锁呢。在业务开发中我们会遇到读写操作,面对读写的数据同步,我们用ReentrantLock锁就可以实现了,但是在实际的读写业务场景中还是读的操作多,写的操作少,那么ReentrantLock锁的效率就会显的很低下。因为无论是读还是写操作,ReentrantLock都要去获取锁。也就是读写互斥,读读也是互斥的。但是我们知道读读互斥其实是不用的,因为我们使用锁的初衷是为了保证数据的同步。读又原创 2022-06-26 17:37:45 · 281 阅读 · 0 评论 -
JUC-ReentrantLock锁基础篇
ReentrantLock是一种可重入的独占锁(互斥锁)。独占锁: 一个线程获取()了这把锁,其他的线程则不能获取。可重入:指的是线程A获取了这把锁,在线程A释放锁之前,线程A本身可以继续来获取这把锁。比如线程A调了了lock()方法获取了这把锁,在线程A调用unlock()方法之前,线程A本身继续调用lock()方法并不会阻塞住。重入锁的设计目的是为了解决死锁的问题。ReentrantLock常常与Synchronized做对比,它们之间的对比如下:ReentrantLock提供的一些常用的方法有:原创 2022-06-25 22:09:37 · 498 阅读 · 0 评论 -
JUC-Semaphore基础篇
Semaphore顾名思义叫做信号量,是操作系统中的一个概念。在java并发编程中,Semaphore本质上是一个共享锁的,用来限制多线程对共享资源的并发访问。Semaphore内部维护了一个计数器state,其值代表了可以访问的共享资源的个数。一个线程如果要访问1个(n个)共享资源,需要先去获得1个(n个)信号量,如果信号量的计数器值大于1个(n个),意味着有共享资源可以访问,则使其计数器state值减去1个(n个),再访问共享资源。使用完后,再将其获得的共享资源个数释放。如果计数器值不满足,则此线程进原创 2022-06-23 16:18:28 · 334 阅读 · 0 评论 -
JUC-CountDownLatch基础篇
CountDownLatch是一个同步工具类,表示允许一个或者多个线程来等待其他的线程来完成它们的操作后,才继续执行自己的操作。CountDownLatch的作用其实很简单,其实就是一个或者一组线程在开始自己的操作时,必须先等待其他的线程操作执行完,才可以执行后面的操作。场景举例: 比如现在有一个门,门上有5把锁,一个人想要通过这个门,必须等5把锁全部被打开,才能通过这个门继续干事情(等待线程),此时有5个解锁的人(5个工作线程),他们可以开锁,于是他们分别去开一把锁,开完锁就会接着去干自己的事情了,等到原创 2022-06-15 11:54:16 · 309 阅读 · 0 评论 -
JUC-CyclicBarrier基础篇
CyclicBarrier顾名思义叫做循环栅栏,它是多个线程之间的同步工具类。它的作用就是会让所有线程都等待完成后才会继续下一步行动。它与JUC另一个多个线程之间的同步工具类CountDownLatch类似,但是功能比CountDownLatch更加强大(它们之间的区别请看JUC-CountDownLatch基础篇)场景举例:比如现在有一个门,门上有5把锁,此时有五个人需要通过这扇门,它们每个人只能打开一把锁,所以执行情况是,来一个人开一把锁,然后等着,直到最后一个人来了打开了最后一把锁。此时5个人才可以原创 2022-06-23 11:01:47 · 198 阅读 · 0 评论