![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
juc
codegad
懂一点java
展开
-
java BlockingQueue 阻塞队列,起来干活,排队唤醒
以 ArrayBlockingQueue为例:队列满或空后,条件阻塞:Conditionput 1、满后,notFull await(), 作为 firstWaiter 加入条件队列,线程阻塞 park 。 4、unpark后, firstWaiter作为 同步队列 头结点后第一个节点开始执行。 take 2、取后,signal,将 firstWaiter 转移到 同步队列。 3、空后,notEmpty await(), 唤醒 unpark 同步队列中...原创 2022-01-05 10:30:37 · 282 阅读 · 0 评论 -
ReentrantLock 老三先歇会,等早到的老二先开动
多个线程同时 请求 lock时, 第二个一直自旋,尝试获取。其余的park,等老大完事,unpark老二,老二开动,老三再自旋等。 //一、加锁 public final void acquire(int arg) { if (!tryAcquire(arg) && acquireQueued(addWaiter(Node.EXCLUSIVE), arg)) selfInterrupt();原创 2021-12-21 15:59:06 · 146 阅读 · 0 评论 -
CyclicBarrier 先给我等着,到时一起上
1、线程先塞到 condition 队列中,然后 最后一个线程到达时,同步到 AQS 队列中,逐一唤醒。加入 AQS的队列后,队列中第二个节点一直自旋尝试唤醒后续节点。 1、 public CyclicBarrier(int parties, Runnable barrierAction) { if (parties <= 0) throw new IllegalArgumentException(); this.p...原创 2021-12-17 15:58:53 · 62 阅读 · 0 评论 -
悟了 CountDownLatch 这样唤醒队列中线程
CountDownLatch2、node设置 preNode的 ws为 -1 ;然后 唤醒队列中线程,清除队列节点。后人把前人的 ws 改为 -1 ,就是为了到时候 前人能把 后人叫醒!(自己付出努力,只为自己能醒过来!)1、唤醒队列中线程,清除队列节点。2、node设置 preNode的 ws为 -1...原创 2021-12-16 15:11:43 · 522 阅读 · 0 评论