-
Notifications
You must be signed in to change notification settings - Fork 45.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
关于AQS组件部分的文章的错误 #645
Comments
收到! |
同时 |
CountDownLatch允许 count 个线程阻塞在一个地方,直至所有线程的任务都执行完毕。拜读了上面楼主写的东西,我对这句话有些疑惑,CountDownLatch不应该是允许一到多个线程阻塞,直至count个线程的任务完成,然后唤醒阻塞的线程嘛,烦请解释! |
不好意思,我的描述确实有问题,给各位造成误解了。。 应该是允许多个线程阻塞,直至count个线程执行完毕,然后unpark阻塞的线程。 |
嗯嗯,还有,关于CountDownLatch。当调用await方法的时候,如果state不为0,就代表仍然有线程没有调用countDown方法,那么就把已经调用过countDown的线程都放入阻塞队列Park,并自旋CAS判断state == 0,直至最后一个线程调用了countDown,使得state == 0,于是阻塞的线程便判断成功,全部往下执行。
----------------------------------------------------------------------
我感觉是不是把CountDownLatch和CyclicBarrier 搞混了,,CountDownLatch中,假如某线程A调用await方法时,如果state不为0,就代表还有线程未执行countDown方法,那那么就把线程A放入阻塞队列中,通过多次自旋仍未获得这把共享锁,就挂起A等待唤醒。而不是把先执行完CountDown方法的线程放入到阻塞队列中。
而对于CyclicBarrier 的话,假设count个线程,每一个线程执行到await方法时,就放入到阻塞队列,直到所有的线程都执行了await方法,count变为0了,此时就释放队列中的所有线程,唤醒所有的线程。
个人认为这个也是CountDownLatch和CyclicBarrier的一个区别,前者关注的是一个线程或多个线程什么时候能执行,而前面执行完countdown方法的线程们爱干嘛干嘛,后者关注的是多个线程,在任意一个线程没有完成后,所有的线程都必须等待,就像是召唤龙珠,七颗才能召唤,需先集齐七颗,在召唤龙珠,之间的任何一个如果先找到,就等着,直到搜集到七颗,缺一不可。
不是杠精,只是想搞懂知识点
…------------------ 原始邮件 ------------------
发件人: "YangGuang"<[email protected]>;
发送时间: 2020年3月27日(星期五) 上午10:05
收件人: "Snailclimb/JavaGuide"<[email protected]>;
抄送: "张亚川"<[email protected]>; "Comment"<[email protected]>;
主题: Re: [Snailclimb/JavaGuide] 关于AQS组件部分的文章的错误 (#645)
CountDownLatch允许 count 个线程阻塞在一个地方,直至所有线程的任务都执行完毕。
拜读了上面楼主写的东西,我对这句话有些疑惑,CountDownLatch不应该是允许一到多个线程阻塞,直至count个线程的任务完成,然后唤醒阻塞的线程嘛,烦请解释!
不好意思,我的描述确实有问题,给各位造成误解了。。
应该是允许多个线程阻塞,直至count个线程执行完毕,然后unpark阻塞的线程。
—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub, or unsubscribe.
|
我关于CountDownLatch的说法和你的是一样的,但是你的的确准确一些,以后我会组织好语言的。 至于你说的CountDownLatch和CyclicBarrier的区别,这个我觉得看个人理解吧,CountDownLatch使用的是AQS实现的,CyclicBarrier使用的是ReentrantLock实现的,虽然都属于AQS,但这也是它们一个不同点吧,CyclicBarrier的实现更复杂写。在我看来,对它们最最最简单的理解就是CyclicBarrier可以允许多次阻塞,而CountDownLatch只能够阻塞一次。 |
没事没事,就是对于我这种人可能理解能力没那么强,容易误解。
…------------------ 原始邮件 ------------------
发件人: "YangGuang"<[email protected]>;
发送时间: 2020年3月27日(星期五) 中午11:43
收件人: "Snailclimb/JavaGuide"<[email protected]>;
抄送: "张亚川"<[email protected]>; "Comment"<[email protected]>;
主题: Re: [Snailclimb/JavaGuide] 关于AQS组件部分的文章的错误 (#645)
我关于CountDownLatch的说法和你的是一样的,但是你的的确准确一些,以后我会组织好语言的。
至于你说的CountDownLatch和CyclicBarrier的区别,这个我觉得看个人理解吧,CountDownLatch使用的是AQS实现的,CyclicBarrier使用的是ReentrantLock实现的,虽然都属于AQS,但这也是它们一个不同点吧,CyclicBarrier的实现更复杂写。在我看来,对它们最最最简单的理解就是CyclicBarrier可以允许多次阻塞,而CountDownLatch只能够阻塞一次。
—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub, or unsubscribe.
|
我也是。这个是我正在写的一份开源文档资料,如果你有好的想法,可以pr: framework-learning |
好的好的,star一波
…------------------ 原始邮件 ------------------
发件人: "YangGuang"<[email protected]>;
发送时间: 2020年3月27日(星期五) 中午11:53
收件人: "Snailclimb/JavaGuide"<[email protected]>;
抄送: "张亚川"<[email protected]>; "Comment"<[email protected]>;
主题: Re: [Snailclimb/JavaGuide] 关于AQS组件部分的文章的错误 (#645)
没事没事,就是对于我这种人可能理解能力没那么强,容易误解。
…
------------------ 原始邮件 ------------------ 发件人: "YangGuang"<[email protected]>; 发送时间: 2020年3月27日(星期五) 中午11:43 收件人: "Snailclimb/JavaGuide"<[email protected]>; 抄送: "张亚川"<[email protected]>; "Comment"<[email protected]>; 主题: Re: [Snailclimb/JavaGuide] 关于AQS组件部分的文章的错误 (#645) 我关于CountDownLatch的说法和你的是一样的,但是你的的确准确一些,以后我会组织好语言的。 至于你说的CountDownLatch和CyclicBarrier的区别,这个我觉得看个人理解吧,CountDownLatch使用的是AQS实现的,CyclicBarrier使用的是ReentrantLock实现的,虽然都属于AQS,但这也是它们一个不同点吧,CyclicBarrier的实现更复杂写。在我看来,对它们最最最简单的理解就是CyclicBarrier可以允许多次阻塞,而CountDownLatch只能够阻塞一次。 — You are receiving this because you commented. Reply to this email directly, view it on GitHub, or unsubscribe.
我也是。这个是我正在写的一份开源文档资料,如果你有好的想法,可以pr: framework-learning
—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub, or unsubscribe.
|
感谢!!! |
嗯嗯,还有,关于CountDownLatch。当调用await方法的时候,如果state不为0,就代表仍然有线程没有调用countDown方法,那么就把已经调用过countDown的线程都放入阻塞队列Park,并自旋CAS判断state == 0,直至最后一个线程调用了countDown,使得state == 0,于是阻塞的线程便判断成功,全部往下执行。 将调用过countDown的线程都放入阻塞队列Park,改成将所有调用await的线程都放入阻塞队列Park |
如上图:
关于文章中的:
“ Semaphore(信号量)可以指定多个线程同时访问某个资源。”
这句话在我阅读源码后发现,Semaphore 可以指定一次性可以指定最多 permits个线程执行任务,而不是 : "同时",因为Semaphore它的实现是只要AQS的state>0 == true,那么线程通过不断自旋CAS,就有机会获得执行任务的机会,所以只要在线程自旋期间,state是大于0的,那么任何一个线程都有可能判断成功,而不是多个线程同时成功。。
然后关于这部分AQS组件的描述个人认为有点模糊不清,所以我在整理后重新组织了下语言:
CountDownLatch
CountDownLatch允许count个线程阻塞在一个地方,直至所有线程的任务都执行完毕。
Semaphore
Semaphore允许一次性最多(不是同时)permits个线程执行任务。
CycliBarrier
CycliBarrier的功能与CountDownLatch相似,但是CountDownLatch的实现是基于AQS的,
而CycliBarrier是基于ReentrantLock(ReentrantLock也属于AQS同步器)和Condition的.
老哥可以选择性的更改下错误的部分。。。
The text was updated successfully, but these errors were encountered: