AQS和ConcurrentLinkedQueue两个队列实现细节分析(草稿)

ConcurrentLinkedQueue(简称clq)
 头尾节点的更新使用懒更新
    因为clq使用cas操作更行tail和head,CAS即乐观锁,而只有在真正乐观的时候(竞争不够激烈)使用CAS才比加锁 park线程要快。为了避免竞争太激烈而造成cas一直失败,即让情况更加符合所谓的乐观情况,懒更新就可以起到一定作用。
AQS的锁获取也是先尝试几次CAS,如果都失败了则把线程加入等待队列,避免了极端情况(cas一直失败cpu一直空转)的发生。
 clq没有这样做,他只是使用懒更新来尽量避免出现竞争太激烈的cas全失败的情况。原因可能是这样:1,clq适用于特定场景,典型如生产者消费者,对于单纯的队列操作(队头取元素,队尾入元素)一般比较快,即使并发很高也很难发生cas一直失败的情况。懒更新
就足够了。而aqs面对的情况则要更加复杂,加锁释放锁之间有可能持续时间非常长(例如加锁循环处理表的数据等),几次cas+park线程无疑更加适用一般情况。
 

你可能感兴趣的:(JAVA)