「这是我参与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操作,直到成功为止
4. 主要方法
| 名称 | 介绍 |
|---|---|
| add() | 底层调用offer() |
| offer() | Queue接口继承下来的方法,实现队列的入队操作,不会阻碍线程的执行,插入成功返回true |
| poll() | 移动头结点指针,返回头结点元素,并将头结点元素出队;队列为空,则返回null |
| peek() | 移动头结点指针,返回头结点元素,并不会将头结点元素出队;队列为空,则返回null |
5.几种主要的非阻塞队列
- ConcurrentLinkedQueue:基于链接节点的无界线程安全队列,它采用先进先出的规则对节点进行排序,当我们添加一个元素的时候,它会添加到队列的尾部;当我们获取一个元素时,它会返回队列头部的元素。入队和出队操作均利用CAS(compare and set)更新,这样允许多个线程并发执行,并且不会因为加锁而阻塞线程,使得并发性能更好