专科生去华为面试,后续来了。。。

专科生去华为面试,后续来了。。。

大家好,我是銘,全栈开发程序员。

今天我正上班呢,一个之前的同事给我发信息,说他去华为面试了,我听到这个消息有点懵逼,我和他是同一年毕业的,我是本科,他是专科,我们同一年进入公司,都是干了三年后跳槽,我跳槽到银行,他在家准备了三个月,去华为面试了,我就问他怎么想到去华为面试了呢。

他说没有因为学历自卑过,后来才发现大专生也没什么好自卑的,现在这个社会缺少的压根不是学历,是能持续学习并去行动的能力。

聊天记录

然后我就问他了他面试流程,他说先是机试,抽到的 C 卷, 后面搜了一下三个题都是新题…最后卡着时间提交的 100% 75% 75%, 完全是因为平时根本不做题, 太生疏,时间不够用, 不然三个题都能 100% 过。题并不算难.

再是性格测试, 网上搜一下按教程来把雷点记住就行,不要踩雷, 把自己造成一个996是福报的打工人就行, 注意前后一致.

然后就有个用人部门的人给他打电话介绍情况,问他能不能干, 他直接说能 ( 他都干了好几年全栈了, 基本什么都懂点),反正给我多少钱给干多少活, 加了个微信也一句话没说过, 天天看他在朋友圈发广告了…

后来又是资格面试, 一个不知道什么身份的人跟他视频会议聊了聊天,,主要就是问问工作几年了, 期望多少钱…他当时说完就后悔了, 说了个最少 25k 说少了,应该多说点的, 直接一下子给自己坑了.

后面就是技术一面和技术二面 (一天两面) ,两个是完全一样的独立面试,只不过是随机两个不同面试官来做,就是自我介绍,问问项目经历, 只要是自己做的项目怎么着都能说上一些话,并且面试官不可能比你还了解你参加过的项目, 反正他觉得那两个面试官应该都不太熟悉他的项目方向没问出多少东西, 然后就是手撕代码了。

后面还会有个主管面, 不过面试完之后,告诉他这个岗位是晚点转签华为慧通,但是工作对接和职级晋升都是华为的。

我在百度上查了一下,华为在招聘的时候,高级员工在华为,低级员工就会在慧通,也就是华为外包,

image-20240304230426989

知乎上又一个话题就是面试华为,最后签的是慧通,问网友最后该不该去?

有一个网友有过这样的经历,在下面回答的很详细,华为对外包类(含od、odc、慧通、中软、软通…)廉价劳动力有统一的定价:一万上下,会做背调,个人薪资上调不得超过20%,即使本来就超过一万多的人,进来华为也只会给一万左右的收入(技术岗会高一点点)。

每一次加班,要提前邮件给主管批才会给算加班费,其余加班属于自愿加班,并且每月一次的周六两倍薪资也看领导是否同意才能来。。。

最后说下我个人的看法,慧通算是外包也不是外包,是全资外包而已,干的还是外包的事:不那么重要的人去做一些技术难度低的流水线一般的事。

另外华为是分级的14级以下大部分都是外包。我个人觉得如果有水平就不要去外包,如果水平一般的话,那就不要介意外包,毕竟大厂的外包确实比一些公司的薪资福利香的多。暂时先去外包干着,有合适的机会再跳槽。

好,那既然说到了华为,那就来聊一道华为一面的面试题。

题目:关于CAS(乐观锁)的原理解析

CAS(Compare And Swap)原理解析

CAS就是是JDK提供的非阻塞原子性操作,通过硬件保证了比较-更新操作的原子性。它的主要原理如下:

CAS有三个操作数

  • 内存值v
  • 旧的预期值A
  • 要修改的新值B

当多个线程尝试使用CAS同时更新一个变量的时候,只有一个能够更新成功。那就是当我们的内存值V和旧的预期值A相等的情况下,才能将内存值V修改成B!然后失败的线程不会挂起,而是被告知失败,可以继续尝试(自旋)或者什么都不做!

尝试重试

我们可以假设有两个线程,一个线程1,一个线程2,同时对我们的内存值进行自增!我们的内存值刚开始是0,旧的预期值也是0。

  • 这个时候线程1进来了,由于我们的内存值和旧的预期值相等,所以更新我们的内存值为要修改的新值1
  • 当线程1结束之后,线程2进来了,要对我们的内存值进行修改。但是发现我们的内存A(此时为1)和我们的旧的预期值不相等(此时为0)不相等,所以不能将内存值更新为我们的预期值(预期值为2),所以只能进行将旧的预期值更新为内存值(此时旧的预期值 == 内存值),并告知下一次再试试!
  • 当我们的线程2重试更新内存值,此时内存值(此时为1)与我们的旧的预期值(此时为1)相等,所以可以将我们的内存值更新为我们的预期值(此时为2)。

所以,哪怕没有加锁,我们也能实现线程安全。

什么都不做

同样的,我们举例有两个线程,一个线程1,一个线程2;我们两个线程都要对内存进行更新为10。

  • 我们假设线程1先进来,此时内存值与我们的旧的预期值都为0,所以可以更新,将我们要修改的新值10赋值给了内存值,完成了更新
  • 当线程1完成之后,线程2进来要对我们的内存值进行修改为10,但是发现内存值与旧的预期值不相同(此时一个为10,一个为0),所以只能将旧的预期值更新为内存值,同时被告知了下次不用重试了。(因为我们的目的是将内存值更新为10,显然我们的目的已经完成了)

原子变量类简单分析

我们在开头也提到了,在我们JUC下的原子变量类也是使用CAS来保证操作的原子性。而我们的具体原子变量类有以下这些:

image-20240304231412552

我们以AtomicInteger为例,找一个其中自增的方法分析一下:

//var1 是this指针
//var2 是地址偏移量
//var4 是自增的数值,是自增1还是自增N   
public final int getAndAddInt(Object var1, long var2, int var4) {int var5;do {//获取我们的的期望值赋值给var5var5 = this.getIntVolatile(var1, var2);//调用了Unsafe下面的另一个方法,是一个native方法//如果期望值var5与内存值var2相等的话,更新内存值为var5+var4,否则更新期望值为期望值为内存值} while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));return var5;}

compareAndSwapInt方法是我们的调用native方法

// 第一和第二个参数代表对象的实例以及地址,第三个参数代表期望值,第四个参数代表更新值
public final native boolean compareAndSwapObject(Object var1, long var2, Object var4, Object var5);public final native boolean compareAndSwapInt(Object var1, long var2, int var4, int var5);public final native boolean compareAndSwapLong(Object var1, long var2, long var4, long var6);

它是由我们的底层c代码调用汇编使用的,最后生成出一条CPU指令cmpxchg,完成操作。这也就为啥CAS是原子性的,因为它是一条CPU指令,不会被打断。这个指令在我们早期的硬件厂商就在芯片大量使用了,比如intel。

ABA 问题

关于CAS还有一个比较典型的问题,那就是ABA问题。

ABA问题的产生是因为变量的状态值产生了环形转换,就是变量的值可以从A到B,然后再从B到A。举个例子:

  • 现在我有一个变量count=10,现在有三个线程,分别为A、B、C
  • 线程A和线程C同时读到count变量,所以线程A和线程C的内存值和预期值都为10
  • 此时线程A使用CAS将count值修改成100
  • 修改完后,就在这时,线程B进来了,读取得到count的值为100(内存值和预期值都是100),将count值修改成10
  • 线程C拿到执行权,发现内存值是10,预期值也是10,将count值修改成11

我们重点放在C上面,虽然我们的C成功的修改了值。但是内存值和预期值和我们原来的相同,C就不知道之前这个变量已经被两个线程操作过了。所以就会有一定的风险。举个风险通俗的例子:

小明在提款机,提取了50元,因为提款机问题,有两个线程,同时把余额从100变为50。

  • 线程1(提款机):获取当前值100,期望更新为50
  • 线程2(提款机):获取当前值100,期望更新为50
  • 线程1成功执行,线程2某种原因block了,这时,某人给小明汇款50
  • 线程3(默认):获取当前值50,期望更新为100。这时候线程3成功执行,余额变为100
  • 线程2从Block中恢复,获取到的也是100,compare之后,继续更新余额为50!!!

此时可以看到,实际余额应该为100(100-50+50),但是实际上变为了50(100-50+50-50)这就是ABA问题带来的成功提交。


我们针对这个思考,如果变量的值只能朝着一个方向转换,比如A到B,B再到C,不构成环形,就不会存在问题。在我们的Java中提供了两个原子类,为我们提供了版本号(时间戳)的方法解决了该问题!

AtomicStampedReferenceAtomicMarkableReference)。

这样我们的A-B-A就会变成1A-2B-3A这种存在,就不存在环形问题了。

总结

我们的CAS虽然解决了原子性,避免了锁的不必要开销。但是还是存在三个问题。

**第一个问题就是自旋时间长开销大!**有时候自旋时间过长,消耗CPU资源,如果资源竞争激烈,多线程自旋长时间消耗资源。所以我们通过具体场景来选择加锁还是通过CAS来解决,CAS是适用于多读的环境的,如果是大量读写的操作的话,还是加锁吧!

**第二个问题就是我们的ABA问题!**在上面已经具体介绍了,以及给上了解决方法。

**第三个问题就是我们的CAS只能保证一个共享变量的原子操作。**也就是说我们只能对一个变量进行赋值,不能同时更新多个。 解决的方法:把多个共享变量合并成一个共享变量。然后使用我们的AtomicReference类来保证引用对象之间的原子性。

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

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

相关文章

基于粒子群优化算法的图象聚类识别matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于粒子群优化算法的图象聚类识别。通过PSO优化方法,将数字图片的特征进行聚类,从而识别出数字0~9. 2.测试软件版本以及运行结果展示 M…

StarRocks——中信建投统一查询服务平台构建

目录 一、需求背景 1.1 数据加工链路复杂 1.2 大数据量下性能不足,查询响应慢 1.3 大量实时数据分散在各个业务系统,无法进行联合分析 1.4 缺少与预计算能力加速一些固定查询 二、构建统一查询服务平台 三、落地后的效果与价值 四、项目经验总结…

用docker部署后端项目

一、搭建局域网 1.1、介绍前后端项目搭建 需要4台服务器,在同一个局域网中 1.2、操作 # 搭建net-ry局域网,用于部署若依项目 net-ry:名字 docker network create net-ry --subnet172.68.0.0/16 --gateway172.68.0.1#查看 docker network ls…

Elasticsearch:向量相似度计算 - 可笑的速度

作者:Chris Hegarty 任何向量数据库的核心都是距离函数,它确定两个向量的接近程度。 这些距离函数在索引和搜索期间执行多次。 当合并段或在图表中导航最近邻居时,大部分执行时间都花在比较向量的相似性上。 对这些距离函数进行微观优化是值…

鸿蒙实战开发:【SIM卡管理】

概述 本示例展示了电话服务中SIM卡相关功能,包含SIM卡的服务提供商、ISO国家码、归属PLMN号信息,以及默认语音卡功能。 样例展示 基础信息 介绍 本示例使用sim相关接口,展示了电话服务中SIM卡相关功能,包含SIM卡的服务提供商、…

力扣每日一题 用栈实现队列

Problem: 232. 用栈实现队列 文章目录 思路复杂度💖 朴素版💖 优化版 思路 👨‍🏫 路飞题解 复杂度 时间复杂度: 添加时间复杂度, 示例: O ( n ) O(n) O(n) 空间复杂度: 添加空间复杂度, 示例: O ( …

Qt+FFmpeg+opengl从零制作视频播放器-1.项目介绍

1.简介 学习音视频开发,首先从做一款播放器开始是比较合理的,每一章节,我都会将源码贴在最后,此专栏你将学习到以下内容: 1)音视频的解封装、解码; 2)Qtopengl如何渲染视频&#…

sql单表运用11.3

一、进入数据库操作界面 1、mysql -u root -p 敲回车 ,输入密码 ,进入数据库操作界面 2、show databases 查看所有的数据(如果没有数据库:创建数据库 create database 库名称) 3、use 数据库名 使…

IDEA中Maven无法下载jar包问题解决

在项目中经常会遇到jar包无法下载的问题,可以根据以下几种方法进行排查。 1. 排查网络连接 网络连接失败,会导致远程访问Maven仓库失败,所以应确保网络连接正常。 2. 排查Maven的配置 Maven配置文件(settings.xml)…

交友盲盒系统PHP开源的盲盒源码

源码介绍: 交友盲盒系统是一款基于PHP开发的开源免费盲盒系统,旨在为用户提供一个充满乐趣和惊喜的社交体验。该系统具有丰富的功能和灵活的扩展性,可以轻松地满足各种线上交友、抽奖活动等场景的需求。 安装说明: PHP版本&…

基于springboot+vue线上教育平台管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现线上教育平台管理系统演示 摘要 本文讲述了使用SSM框架及My Sql数据库技术开发的线上教育网站的设计与实现。本系统是一个可以让学生进行在线学习的网站,众所周知,计算机专业的难度是比较高的,如果只通过在课堂上的学习&a…

【性能测试】Jmeter性能压测-阶梯式/波浪式场景总结(详细)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、阶梯式场景&am…