【面试手撕】CAS实现 线程安全的链表结构的栈

利用Atomic原子引用,采用CAS的方式,实现线程安全的链表栈的实现

关键点
关键在于用
AtomicReference原子类包装栈顶节点,在更改新的栈顶节点的时候,判断原子引用的栈顶是否还是之前获取时的栈顶,如果不是则重新通过AtomicReference获取栈顶

关键代码
headReference.compareAndSet(oldHead, newHead)


// TODO 这是线程安全的版本
public class MyStack2 {class Node{int value;Node next;}// TODO 这个在堆中是线程共享的private final AtomicReference<Node> headReference = new AtomicReference<>();// 弹出public int pop(){Node oldHead;Node newHead;do{oldHead = headReference.get();if (oldHead == null){throw new EmptyStackException();}newHead = oldHead.next;     // 这里不需要将oldHead.next置null,也不能置空,可能会出错// cas设置新的栈顶}while (!headReference.compareAndSet(oldHead, newHead));return oldHead.value;}// 压栈public void push(int value){Node node = new Node();node.value = value;Node oldHead;// TODO 采用CAS的方式// 先获取栈顶,将新节点指向栈顶,如果栈顶还是原来的栈顶,则将新节点设置为栈顶,否则重新获取栈顶do{oldHead = headReference.get();node.next = oldHead;// 将node置为新的head// headReference只是用来存放head的// 如果headReference中的值还是oldHead,则将node放入headReference作为新的head// 如果不成功,重新获取oldHead}while (!headReference.compareAndSet(oldHead, node));}// 查看栈顶public int peek(){Node head = headReference.get();if (head == null){throw new EmptyStackException();}return head.value;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/26623.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

搜索是门艺术,大神都是这样找资源

以下所有资源均可在星云导航找到&#xff0c;网站地址&#xff1a;https://www.xygalaxy.com/ 浏览器搜索高级用法 1、排除干扰&#xff0c;指定关键词 1.1、排除指定关键字 格式&#xff1a;关键字1 -关键字2比如搜索&#xff1a;星云导航&#xff0c;不想要CSDN的内容 星…

Stable Diffusion 3 开源发布可下载体验

本文来自huggingface翻译 Stable Diffusion 3 Medium是一种多模态扩散变换器 (MMDiT) 文本到图像模型&#xff0c;其在图像质量、排版、复杂提示理解和资源效率方面的性能有极大提升。 有关更多技术细节&#xff0c;请参阅研究论文。 请注意&#xff1a;此模型是根据 Stabilit…

C# —— 条件运算符

条件运算符的作用: 用于比较两个变量或者常量 // > // < // // ! // > // < 条件运算符 一定存在左右两边的内容 左边内容 条件运算符 右边内容 int a 30; int b 50; 条件运算符 不…

java面试题:hashMap扩容机制

初始容量和加载因子&#xff1a; HashMap在初始化时有一个默认的初始容量&#xff08;capacity&#xff09;&#xff0c;通常是16。这个容量也可以在创建HashMap时通过构造函数指定。 HashMap还有一个加载因子&#xff08;load factor&#xff09;&#xff0c;这是一个表示Has…

【全开源】快递寄件小程序源码(FastAdmin+ThinkPHP+原生微信小程序)

&#x1f4e6;快递寄件小程序&#xff1a;轻松寄送&#xff0c;便捷生活 &#x1f69a;一、引言&#xff1a;告别繁琐&#xff0c;让寄件更简单 在繁忙的生活中&#xff0c;寄送快递往往成为我们的一大难题。传统的寄件方式需要前往快递公司网点&#xff0c;填写繁琐的寄件信…

单目标应用:基于蛇鹫优化算法SBOA的微电网优化(MATLAB代码)

一、微电网模型介绍 微电网多目标优化调度模型简介_vmgpqv-CSDN博客 参考文献&#xff1a; [1]李兴莘,张靖,何宇,等.基于改进粒子群算法的微电网多目标优化调度[J].电力科学与工程, 2021, 37(3):7 二、蛇鹫优化算法求解微电网 2.1算法简介 蛇鹫优化算法&#xff08;Secre…

基于python多光谱遥感数据处理、图像分类、定量评估及机器学习

原文链接&#xff1a;基于python多光谱遥感数据处理、图像分类、定量评估及机器学习 普通数码相机记录了红、绿、蓝三种波长的光&#xff0c;多光谱成像技术除了记录这三种波长光之外&#xff0c;还可以记录其他波长&#xff08;例如&#xff1a;近红外、热红外等&#xff09;光…

企业中的绩效管理

背景 企业中为何需要绩效管理&#xff0c;企业绩效管理为何比较难&#xff0c;这在企业管理中是非常难&#xff0c;同样也是非常有价值的命题&#xff0c;那么首先应该对这个命题有清晰的认知&#xff0c;特别是要想明白为何企业需要绩效管理&#xff0c;应该先明白企业。 企…

Uniapp实现页面滚动Tab吸顶,点击tab内容滚动到对应tab内容位置

1.template结构 <view class"content-tabs-box"><view class"content-tabs" :class"{is-fixed: isTabFixed}"><viewv-for"(item, index) in detailTabs" :key"index" class"tab" :class"{act…

【git使用四】git分支理解与操作(详解)

目录 &#xff08;1&#xff09;理解git分支 主分支&#xff08;主线&#xff09; 功能分支 主线和分支关系 将分支合并到主分支 快速合并 非快速合并 git代码管理流程 &#xff08;2&#xff09;理解git提交对象 提交对象与commitID Git如何保存数据 示例讲解 &a…

lnmp的介绍与源码部署以及 |什么是正向、反向、透明代理 | 常见的集群有哪些

lnmp 文章目录 lnmp1.LNMP是什么2. lnmp简介3.系统特点4.优点5.lnmp部署5.1 nginx安装5.2 mysql安装5.3 php安装5.4配置nginx服务处理php 6.扩展知识点1.什么是集群2.常见的集群有哪些集群的分类1、高可用集群2、负载均衡集群3、分布式计算集群4、高性能集群(High Performance …

TCP标志

SYN (Synchronize) 和 ACK (Acknowledgement) 是TCP协议中的两种重要标志&#xff08;flags&#xff09;&#xff0c;用于建立和维护连接。它们通常在TCP三次握手过程中使用。 1、SYN标志&#xff1a; 当客户端想要建立于服务器的TCP连接时&#xff0c;它会发送一个带有SYN白…

嵌入式常用调试方法

目录 调试工具 日志打印 1. Debug日志打印 2. RTT日志打印 3. 串口日志打印 总结 嵌入式系统的调试是一个复杂且关键的过程&#xff0c;涉及多种工具和技术的综合应用。以下是对嵌入式常见调试工具、日志打印方式的全面报告&#xff0c;包括Debug、RTT&#xff08;Real-T…

重生奇迹mu魔法师介绍

魔法师擅长&#xff1a;远距作战、攻击&辅助魔法使用 转职&#xff1a;魔导师&#xff08;2转&#xff09;&#xff0c;神导师&#xff08;3转&#xff09; 魔法师可以通过多样的魔法&#xff0c;展现华丽的效果和强大的实力。成长初期因为体力少&#xff0c;经常受到死亡…

Linux Shell命令vim使用

一、引例 以判断引出&#xff08;学过C其他语言容易接受&#xff09;。 简单命令说明&#xff1a; -e 测试文件是否存在 -f 测试文件是否为普通文件 -d 测试文件是否为目录 -r 测试当前用户对某文件是否具有“可读”权限 -w 测试当前用户对某文件是否具有“可写”权限…

线程池前置知识

并发和并行 并发是指在单核CPU上&#xff0c;多个线程占用不同的CPU时间片。线程在物理上还是串行执行的&#xff0c;但是由于每个线程占用的CPU时间片非常短&#xff08;比如10ms&#xff09;&#xff0c;看起来就像是多个线程都在共同执行一样&#xff0c;这样的场景称作并发…

Python私教张大鹏 Vue3整合AntDesignVue之Cascader 级联选择

何时使用 需要从一组相关联的数据集合进行选择&#xff0c;例如省市区&#xff0c;公司层级&#xff0c;事物分类等。 从一个较大的数据集合中进行选择时&#xff0c;用多级分类进行分隔&#xff0c;方便选择。 比起 Select 组件&#xff0c;可以在同一个浮层中完成选择&#…

聊聊C/S模式架构的优缺点

C/S模式架构&#xff0c;即客户端-服务器&#xff08;Client/Server&#xff09;架构&#xff0c;是一种常见的软件系统架构&#xff0c;以下是C/S模式架构的优缺点分析。 C/S架构优点部分&#xff1a; 性能高效&#xff1a;由于客户端直接与服务器进行数据交换&#xff0c;没…

关于创建Cloudeflare的r2桶以及如何使用rclone连接

一、名词解释 r2桶是cloudflare给用户的免费10G储存空间&#xff0c;可与自定义域创建链接的储存storge。 rclone是开源工具&#xff0c;用于在本地通过软件链接云储存storege&#xff0c;让用户可以修改、同步、删除云储存中的内容。 rcloneBrowser是rclone的GUI版本&#x…

足底筋膜炎怎样才能彻底治愈

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…