cdl用的是aqs,共享的是aqs那个volatile的state,阻塞线程列表用的也是aqs的

cb用的是reentrantlock+condition,当然rel用的也是aqs不过不同的是用的是互斥的,只保证线程的互斥和全局变量比如generation.broken和count的可见。共享的是靠的全局变量count,阻塞列表用的是condition

cdl需要countdown减一,然后await检测、等待、挂起,将两部分分开

而cb的await里面一步进行

灵活vs简单

cb可传入一个runnable,在所有线程都等待完毕之后执行,还可以reset,重置count的值,做一些别的事情

cb里面一个是aqs共享锁的释放,一个是lock互斥锁加锁,两个过程都有可能将线程挂起,不如cdl只需要挂起线程一次

Semaphore比较另类,虽然也是用aqs,是多个比如5个线程竞争3个资源,用了减state,用完了再换回去,这具体场景用在哪里呢?

05-23 17:40