多线程(六)-- 非阻塞队列

333 阅读2分钟

「这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战

1. 介绍

非阻塞队列的执行并不会被阻塞,无论是消费者的出队,还是生产者的入队

2. CAS(Compare and Swap)

  • java.util.concurrent包中借助CAS实现了区别于synchronouse同步锁的一种乐观锁
  • 当多个线程操作同一个共享资源时,仅能有一个线程同一时间获得锁成功,在乐观锁中,其他线程发现自己无法成功获得锁,并不会像悲观锁那样阻塞线程,而是直接返回,可以去选择再次重试获得锁,也可以直接退出
  • CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做

CAS的基本思路就是,如果这个地址上的值和期望的值相等,则给其赋予新值,否则不做任何事儿,但是要返回原值是多少。循环CAS就是在一个循环里不断的做cas操作,直到成功为止

CAS.png

4. 主要方法

名称介绍
add()底层调用offer()
offer()Queue接口继承下来的方法,实现队列的入队操作,不会阻碍线程的执行,插入成功返回true
poll()移动头结点指针,返回头结点元素,并将头结点元素出队;队列为空,则返回null
peek()移动头结点指针,返回头结点元素,并不会将头结点元素出队;队列为空,则返回null

5.几种主要的非阻塞队列

  • ConcurrentLinkedQueue:基于链接节点的无界线程安全队列,它采用先进先出的规则对节点进行排序,当我们添加一个元素的时候,它会添加到队列的尾部;当我们获取一个元素时,它会返回队列头部的元素。入队和出队操作均利用CAS(compare and set)更新,这样允许多个线程并发执行,并且不会因为加锁而阻塞线程,使得并发性能更好