【并发编程079】线程安全的非阻塞队列 ConcurrentLinkedQueue?
2023-09-27 14:29:27 时间
线程安全的非阻塞队列 ConcurrentLinkedQueue?
Tail节点并不总是尾节点, 所以每次入队都必须 先通过tail节点来找到尾节点 。尾节点可能 是 tail节点, 也可能是tail节点的next节点。
让tail节点永远作为队列的尾节点, 这样实现代码量非常少, 而且逻辑清晰和易懂 。但是, 这么做有个缺点, 每次 都需要使用循环CAS更新tail节点 。 如果能减少CAS更新tail节点的次 数, 就能提高入队的效率, 所以并不 是每次节 点入队后都将tail节点更新成尾节点, 但是距离越长带来的负面效果就是每次入队时定位尾节点的时间就越长, 因为 循环体需要多循环一次来定位出尾节点, 但是这样仍然能提高入队的效率, 因为从本质上来 看它通过增加对volatile 变量的读操作来减少对volatile变量的写操作, 而对volatile变量的写操 作开销要远远大于读操作, 所以入队效率会有 所提升
首先获取头节点的元素,然后判断头节点元素是否为空, 如果为空, 表示另外一个线程已 经进行了一次出队操作将该节点的元素取走, 如果不为空, 则使用CAS的方式将头节点的引 用设置成null, 如果CAS成功, 则直接返回头节点的元素, 如果不成功,表示另外一个线程已经进行了一次出队操作更新了head节点, 导致元素发生了变化, 需要重新获取头节点。
相关文章
- 【Java集合】HashMap系列(四)——HashMap在JDK1.7和JDK1.8中的并发问题的分析以及如何保证并发安全
- 高并发场景下,如何优化服务器的性能
- spring quartz使用多线程并发“陷阱”
- Java并发编程:线程池的使用
- 【GoLang】GoLang map 非线程安全 & 并发度写优化
- 【高并发】面试官:讲讲高并发场景下如何优化加锁方式?
- Java高并发专题之17、JUC中的循环栅栏CyclicBarrier
- Java高并发专题之10、线程安全和synchronized
- Elasticsearch7.9:二、索引并发控制
- 谈论高并发(二十二)解决java.util.concurrent各种组件(四) 深入了解AQS(二)
- 云HBase全面支持金融云可用区-支持实时安全风控金融时序大数据量存储及高并发访问
- 使用 channel 控制并发数量
- [WCF REST] 解决资源并发修改的一个有效的手段:条件更新(Conditional Update)
- Java 并发/多线程教程(十)-线程安全及不可变性
- Java 并发/多线程教程(九)-线程安全和共享资源
- boost中asio网络库多线程并发处理实现,以及asio在多线程模型中线程的调度情况和线程安全。
- 对于小的并发量,我们能做的一些简单的优化,特别实际
- 【并发编程092】可以重排序的情况下,如何实现线程安全的单例模式?