Java并发编程实战
文章平均质量分 69
qq_16899143
这个作者很懒,什么都没留下…
展开
-
ThreadPoolExecutor源码研读
原文为https://www.cnblogs.com/huangjuncong/p/10031525.html,因为博主加了注释所以会使用一些他的图片,侵删。对于博主没有讲到的部分会使用jdk源码的截图 为什么要用一个ctl记录线程状态和线程个数?因为需要得到一个对这两个量的同一快照,如果使用两个变量则需要一个锁,而使用一个变量不需要(赋值操作是原子的,赋值后在对副本进行解析,可以保证是同一个的快照)。这种设计非常巧妙,值得学习 线程池状态:RUNNING:运行状态,接受任务且处理阻塞队列中的任..原创 2021-10-03 21:12:21 · 168 阅读 · 0 评论 -
LinkedBlockingQueue源码研读
上次被问到实现线程安全的队列,想了下LinkedBlockingQueue源码读的一知半解,所以再来一次 断点1设置了可中断的锁,这个也符合put操作可中断的特性 断点3 c==0容易误解,注意这个c是getAndIncrement的结果,所以c是目前的size-1,所以当c==0时代表size为1,即可以唤醒阻塞在notEmpty的线程 然后就是断点2和断点3下面的signalNotEmpty的设计,这里困惑了好久,为什么只在size==1时唤醒一次阻塞在notEmpty的线程,然后由p原创 2021-09-23 15:24:49 · 90 阅读 · 0 评论 -
CountDownLatch源码研读
CountDownLatch是用AQS实现的一个工具,大概意思是当有足够多的线程执行了countDown方法后await在countDownLatch上的主线程就可以继续运行了,下面来看看它的源码 和ReentrantLock一样也有一个Sync的AQS实现,但是这个Sync非常简单,可以看到tryAcquireShared根据state是否为0返回acquire是否成功,如果为0则说明已经有足够的countDown执行过了,如果不为0则还需要等待。await直接调用acquireSharedInte原创 2021-09-21 14:29:28 · 104 阅读 · 0 评论 -
ReentrantLock源码研读
继续整理这几天读的源码 ReentrantLock是AQS的一个实现,让我们看看它的源码 其有三个内部类Sync,NonfairSync,FairSync,后面两个继承了Sync,Sync继承了AQS。后面二者是真正工作的类,NonfairSync用于非公平锁,FairSync用于公平锁,这二者除了tryAcquire方法外都使用Sync的方法实现,我们先看看Sync 首先是这个nonfairTryAcquire,逻辑很简单,如果当前state是0即锁空闲,则CAS加锁,成功后使用setExclu原创 2021-09-21 14:28:56 · 80 阅读 · 0 评论 -
AQS源码研读
首先要说明,AQS中队列使用双向链表实现,其中头节点为可能占有资源的线程(这里说可以是因为调用acquire的线程会在未入队前尝试竞争一次资源,如果成功则直接抢占,此时这个节点不需要入队,头节点也就不是占有资源的线程了) AQS中一个节点代表一个线程,节点有一个状态,大于0为被取消状态,小于0为有效等待状态,0新节点默认状态 AQS的入口为acquire/release和acquireShared/releaseShared 首先在这里面调用用户实现的tryAcquire如果成功则直接返.原创 2021-09-20 14:26:01 · 116 阅读 · 0 评论 -
Java并发编程实战 第三章 对象的共享
主要讲了两种构造时可能出现的问题,一种是未构造完成的对象逃逸,一种是由于JVM重排指令导致的状态异常,个人感觉书中讲解的不是很透彻 下面是对象逃逸的一个例子,注意final域也面临对象逃逸问题,虽然在构造器中无法使用未赋值的final域,但是在别的线程调用对象时可以看到未赋值的final域,此时对象还未构造完 public class Main { Main(int i,int j) throws InterruptedException { //! System.out.pr原创 2021-03-26 18:39:51 · 100 阅读 · 0 评论