美团终面:你确定CAS不加锁吗?

2020年美团Java一面,美团面经面试流程面试题整理 很多的从事Java的人都想要去美团工作,那么下面就给大家整理了一些小伙伴2020年美团Java一面的面试流程和具体面试问题及答案,下面一起来看看具体内容吧。 具体面试时间: 3.26笔试 3.30面试 3.31面试 (一面) 具体花费时长:面试大概花了1个小时左右的时间,刷题花了10多分钟左右。 大致流程: 1、先做自我介绍,附带自己的项目,说一下项目当中有没有觉得后端技术有什么特别出众的地方。 2、说一下个人博客系统的业务架构。 3、回答相关问题。 具体问题: 一、Spring (一)SpringMVC 阅读详情

点击上方“芋道源码”,选择“设为星标”

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 10:33 更新文章,每天掉亿点点头发...

源码精品专栏

 

来源:Hollis

60857bf0a36f363381a9646c55043d4a.jpeg


CAS大家都知道,这是一项乐观锁技术,是Compare And Swap的简称,顾名思义就是先比较再替换。

虽然他叫乐观锁,但是我们都知道它是不需要加锁的,在JDK1.5 中的JUC就是建立在CAS之上的。相对于synchronized这种阻塞算法,CAS是非阻塞算法的一种常见实现。所以J.U.C在性能上有了很大的提升。

我们以java.util.concurrent中的AtomicInteger为例,看一下在不使用锁的情况下是如何保证线程安全的。主要理解getAndIncrement方法,该方法的作用相当于 ++i 操作:

public class AtomicInteger extends Number implements java.io.Serializable {  

        private volatile int value;  

    public final int get() {  
        return value;  
    }  

    public final int getAndIncrement() {  
        for (;;) {  
            int current = get();  
            int next = current + 1;  
            if (compareAndSet(current, next))  
                return current;  
        }  
    }  

    public final boolean compareAndSet(int expect, int update) {  
        return unsafe.compareAndSwapInt(this, valueOffset, expect, update);  
    }  
}

getAndIncrement采用了CAS操作,每次从内存中读取数据然后将此数据和+1后的结果进行CAS操作,如果成功就返回结果,否则重试直到成功为止。而compareAndSet利用unsafe的compareAndSwapInt方法实现的。

啥是Unsafe呢?

Unsafe是CAS的核心类。因为Java无法直接访问底层操作系统,而是通过本地(native)方法来访问。不过尽管如此,JVM还是开了一个后门,JDK中有一个类Unsafe,它提供了硬件级别的原子操作。

Unsafe是Java中一个底层类,包含了很多基础的操作,比如数组操作、对象操作、内存操作、CAS操作、线程(park)操作、栅栏(Fence)操作,JUC包、一些三方框架都使用Unsafe类来保证并发安全。

Unsafe类提供了硬件级别的原子操作,如CAS原子操作。

但是,大家有没有想过这样的问题:

硬件层面CAS又是如何保证原子性的呢?真的完全没加锁吗?

拿比较常见的x86架构的CPU来说,其实 CAS 操作通常使用 cmpxchg 指令实现的。

可是为啥cmpxchg 指令能保证原子性呢?主要是有以下几个方面的保障:

  1. cmpxchg 指令是一条原子指令。在 CPU 执行 cmpxchg 指令时,处理器会自动锁定总线,防止其他 CPU 访问共享变量,然后执行比较和交换操作,最后释放总线。

  2. cmpxchg 指令在执行期间,CPU 会自动禁止中断 。这样可以确保 CAS 操作的原子性,避免中断或其他干扰对操作的影响。

  3. cmpxchg 指令是硬件实现的,可以保证其原子性和正确性。CPU 中的硬件电路确保了 cmpxchg 指令的正确执行,以及对共享变量的访问是原子的。

所以,在操作系统层面,CAS还是会加锁的,通过加锁的方式锁定总线,避免其他CPU访问共享变量。

所以,解决并发问题,归根结底还得靠锁!!!



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:

db48d699d38f8f790aa4e25c9815ae9b.png

已在知识星球更新源码解析如下:

ae84b038c3ad5fc6623c86e1e47b8a0e.jpeg

68939f946305b4c6e7a2a9512cd3395e.jpeg

2272c7a7137b476db9f1f3e072a7bd83.jpeg

095d7de4c17382ecf3f3f6fa37bbafbc.jpeg

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
Lumerical官方案例、FDTD时域有限差分法仿真学习(十八)——Y分支粒子群算法优化 组件优化是任何致力于开发高性能光子器件的设计过程的关键步骤。 此绝缘体上硅 Y 分支示例演示了适用于任意优化例程的通用组件形状参数化方法。 此示例中的算法是 Lumerical 的内置粒子群优化 (PSO),可通过用户界面轻松设置。 此外,建议的优化过程展示了如何将 varFDTD 与全 3D FDTD 求解器相结合,以显着减少优化时间,同时保持高精度。 阅读详情

相关推荐

IBIS模型中的Pullup和Pulldown曲线详解:如何避免信号完整性设计中的常见错误

本文深入解析IBIS模型中Pullup和Pulldown曲线的关键作用,揭示其在信号完整性设计中的黄金法则。通过详细分析曲线特性、常见误区及验证方法,帮助工程师避免设计错误,优化高速PCB设计。文章还展示了曲线数据在动态终端匹配、串扰预测和电源完整性分析中的高级应用,提升设计效率和可靠性。

weixin_30275415的博客 451

CAS 单点登录实现

1 资源文件 资源下载地址:https://download.youkuaiyun.com/download/qq_15769939/15434524 资源 文件 网站 静态网站资源 sso-mtc www.mtc.com 静态网站资源 sso-music www.music.com 单点登录源码 sso-demo www.sso.com 1.1 部署静态网站 将 sso-mtc 、 sso-music,部署到Tomcat中,我这边使用的tomcat端口是 8089,如果更改的话,需要

小P聊技术 606

Verilog仿真必备:FSDB dump命令全解析与实战配置指南

本文深入解析了Verilog仿真中FSDB波形记录的核心命令与实战配置技巧。针对大规模SoC验证场景,详细介绍了如何通过$fsdbDumpvars、$fsdbDumpfile等命令实现信号精准捕获、文件体积控制和动态启停,并提供了智能化的分层dump策略,帮助工程师在保证调试信息完整性的同时,大幅提升验证效率并有效管理波形数据。

cnn8visionary的博客 349

CAS 实现 SSO 单点登录

点击上方“芋道源码”,选择“设为星标”做积极的人,而不是积极废人!源码精品专栏原创 | Java 2019 超神之路,很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络...

芋艿V 284

【阿里云大模型高级工程师ACP习题集】2.9 大模型应用生产实践(下篇)

【摘要】这是我精心整理出对应的习题集,里面足足有 30 道题目,从基础概念到深度拓展,全方位覆盖章节重点、难点。不管你是想检验自己的学习成果,还是想针对薄弱环节进行强化训练,它都能完美适配!

davidkorhenn的博客 2237

yolov5部署之七步完成tensorRT模型推理加速

目录前言step 1. 下载yolov5源码以及tensorrtx源码,并将yolov5s.pt转为.wts模型step 2. 确定并下载自己准备使用的CUDA版本。step 3. 根据自己的CUDA版本下载对应版本的cuDNN以及TensorRTstep 4. 根据自己使用的VS版本下载对应版本的OpenCVstep 5. 安装CUDAstep 6. 安装cuDNN、TensorRT以及验证TensorRT是否安装成功 前言     前段时间研究了Pytorch的环境配置,之后便从github上下载了yo

Christo的博客 4万+

【并发编程】CAS到底是什么

CAS是Compare-And-Swap(比较并交换)的缩写,是一种轻量级的同步机制,主要用于实现多线程环境下的无锁算法和数据结构,保证了并发安全性。它可以在不使用锁(如synchronized、Lock)的情况下,对共享数据进行线程安全的操作。

陈宝子的博客 9268

做小程序支付时,我是怎么被“虚拟支付”绊了一跤的

微信小程序支付开发中,普通支付与虚拟支付存在本质差异。开发者常误将虚拟权益(会员、点数等)当作普通商品支付,导致审核失败。两者在审核关注点、结算方式、API调用及平台政策上都截然不同。关键点在于:1)先明确交易对象类型;2)产品命名需真实反映权益性质;3)支付成功≠业务完成;4)审核说明要详细描述交付逻辑;5)避免依赖过时规则。正确顺序应是:判断商品属性→选择支付类型→设计订单系统→准备审核材料。这个认知差异比技术实现更重要,提前理解平台规则可大幅减少返工。

zhurizhe71的学习之路 2582

4面美团、3面拼多多面经分享,现已入职美团

美团4面 一面: 自我介绍 HashMap,ConcurrentHashMap与LinkedHashMap的区别 如何在多线程环境下使用Map,ConcurrentHashMap原理,ConcurrentHashMap如何加锁。 多线程并发的同步实现,有两个方法,每个方法里有a部分代码和b部分代码,我要让两个线程分别执行两个方法,并且让他们运行完a部分代码再一起向下执行,如何实现。 TCP连接中的三次握手和四次挥手,四次挥手的最后一个ack的作用是什么,为什么要time wait,为什么是2ms

YXKFZ的博客 195

超越图灵机——论人工智能实现的可能性(一)

超越图灵机——论人工智能实现的可能性(一)我认为人工智能是可以实现到逻辑思维这一步的,因为逻辑思维可以完全用字符串来表示,图灵机可以把任意单元置成任意值,在这一点上是完备的,这就足以描述逻辑思维了,所以用图灵机完全可以实现到逻辑思维。当然图灵机会受到哥德尔不完备性的制约,但是逻辑系统也会受到同样的制约,所以我认为完全可以用图灵机实现逻辑思维。那么逻辑思维的本质机理与图灵机是什么关系?逻辑思

太极语言 1万+

【RKNN】RKNN(Rockchip Neural Network)​​ 的详解

RKNN 为 Rockchip 硬件提供了高效的 AI 推理解决方案,适合需要低功耗、实时响应的边缘场景

浩瀚之水的专栏 1685

美团一面:什么是CAS?有什么优缺点?我说你说的是AtomicInteger吗?

Java中的CAS原理是什么?它有什么优缺点?什么是ABA问题?如何解决?我们常使用的AtomicInteger,LongAdder是什么?

俺叫赵小邪的博客 820

【DeepSeek R1构建本地RAG知识库】数据结构化清洗-知识图谱制作、使用、dify集成

本文探讨了在构建本地RAG(Retrieval-Augmented Generation)系统时,如何通过引入知识图谱来增强系统的知识理解能力。传统的向量数据库和嵌入模型虽然能处理语义匹配,但无法有效捕捉知识间的关联性。知识图谱通过“实体-关系-属性”的结构化表示,能够更好地支持推理、推荐和多跳问答等高级功能。文章详细介绍了知识图谱的基本概念、制作思路,以及如何使用Neo4j图数据库进行知识图谱的构建和查询。通过实例展示了从PDF文件解析到知识图谱入库的全过程,强调了知识图谱在提升RAG系统性能中的重要作用

少说,多做 564

腾讯蚂蚁字节美团后台实习面经

腾讯蚂蚁字节美团后台实习 腾讯 最初电话面 自我介绍 JVM的内存模型(描述的不流利,有点慌张,可以回答的更好) 堆:对象内存分配,创建,销毁的地点。 虚拟机栈。给方法分配栈帧,然后保存局部变量等信息。 本地方法栈。就是给本地方法,和虚拟机栈一样。 方法区:存储一些类信息,名字等。 程序计数器:解析为字节码后的代码行号 垃圾回收算法(三个算法太过于口语化了,中间还出错了) 复制算法:将内存一分二...

weixin_41917988的博客 1836

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【面试八股】:CAS指令

详细介绍面试八股CAS相关知识点

Beats的学习笔记空间 1086

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

美团java面试_2020年美团Java一面,美团面经面试流程面试题整理

很多的从事Java的人都想要去美团工作,那么下面就给大家整理了一些小伙伴2020年美团Java一面的面试流程和具体面试问题及答案,下面一起来看看具体内容吧。具体面试时间:3.26笔试3.30面试3.31面试(一面)具体花费时长:面试大概花了1个小时左右的时间,刷题花了10多分钟左右。大致流程:1、先做自我介绍,附带自己的项目,说一下项目当中有没有觉得后端技术有什么特别出众的地方。2、说一下个人博客...

weixin_42361874的博客 2098

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

美团java三面_上周刚面过美团拿到offer的最新面经来了(技术三面+HR)

前言本篇题材来自我朋友的朋友,他在最近的社招中拿到美团的Offer,整体思路和面试题目由面试本人提供由于作者面试过程中高度紧张,本文中只列出了自己还记得的部分题目。一面:自我介绍HashMap,ConcurrentHashMap与LinkedHashMap的区别如何在多线程环境下使用Map,ConcurrentHashMap原理,ConcurrentHashMap如何加锁。多线程并发的同步实现,有...

weixin_31363715的博客 614

Unsafe与CAS

既然用锁或 synchronized 关键字可以实现原子操作,那么为什么还要用 CAS 呢,因为加锁或使用 synchronized 关键字带来的性能损耗较大,而用 CAS 可以实现乐观锁,它实际上是直接利用了 CPU 层面的指令,所以性能很高。...

白夜ovo的博客 229

字节跳动、拼多多面经Java岗(分布式+线程安全+MySQL+CAS)

前段时间面试了蚂蚁金服,字节跳动和拼多多,蚂蚁挂了就不详细说了,蚂蚁面试比较重视基础,所以Java那些基本功一定要扎实。后来拿到了字节和拼多多的offer,所以今天主要说说字节和拼多多的面经。 拼多多 一面 聊项目 Java中的HashMap、TreeMap解释下? TreeMap查询写入的时间复杂度多少? ConcurrentHashMap怎么实现线程安全的? HashMap多线程有什么问题?怎么解决? CAS和synchronize有什么区别?都用synchronize不行么? get需要加锁么,为什

程序员Monkey的专栏 5754

java cas机制_并发编程的灵魂:CAS机制详解

年终巨献:一份拿下了阿里、美团等一线大厂offer的学习笔记​zhuanlan.zhihu.comJava中提供了很多原子操作类来保证共享变量操作的原子性。这些原子操作的底层原理都是使用了CAS机制。在使用一门技术之前,了解这个技术的底层原理是非常重要的,所以本篇文章就先来讲讲什么是CAS机制,CAS机制存在的一些问题以及在Java中怎么使用CAS机制。其实Java并发框架的基石一共有两块,一块是...

weixin_30461129的博客 222

上月最新面过美团大众点评拿到 offer 的最新面经来了(技术三面 +HR)

本篇题材来自我朋友的朋友,他在最近的社招中拿到美团的 Offer,整体思路和面试题目由面试本人提供

m0_71563599的博客 374

面试必问CAS,你懂了吗?

在我的另一篇文章中,我对CAS的原理,优缺点,适用场景进行了分析,可以参见这一篇文章乐观锁实现之CAS,在这篇文章中,我简要的讲一下CAS操作在我们多线程编程中怎么使用,以及为什么要用: 话不多说,直接上代码(Talk is cheap. Show me the code) package cn.yqh.interview; import java.util.concurrent.Coun...

yuan_qh的博客 547

Java-Disruptor-高性能队列-美团技术团队

Disruptor通过精巧的无锁设计实现了在高并发情形下的高性能。在美团内部,很多高并发场景借鉴了Disruptor的设计,减少竞争的强度。其设计思想可以扩展到分布式场景,通过无锁设计,来提升服务性能。使用Disruptor比使用ArrayBlockingQueue略微复杂,为方便读者上手,增加代码样例。代码实现的功能:每10ms向disruptor中插入一个元素,消费者读取数据,并打印到终端。详细逻辑请细读代码。以下代码基于3.3.4版本的Disruptor包。/**

Java程序员的知识博客 2465

从两大方面给大家分享5面美团Java岗的面试总结,已顺利拿下offer

美团Java面试真题 1.java虚拟机内存模型 2.内存溢出一般发生在哪个区?永久代会不会导致内存溢出? 3.动态加载类的框架了解哪些? 4.动态代理一般有哪几种实现方式?动态代理的应用场景有哪些? 5.栈会不会溢出?栈溢出一般抛什么异常? jvm在哪里设置栈的大小?设置的参数是什 么? 6.用过哪些命令查看jvm的状态、堆栈信息? 7.jvm的垃圾回收机制? 8.java类加载机制?如何实现...

如果频繁就私信一下呢 1340
上一篇: Kubernetes 上 Java 应用的最佳实践
下一篇: 看看人家的快速开发平台,确实清新优雅!
公众号-芋道源码
博客等级 码龄10年 1631粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值