一位211大学毕业生工作五年后,被腾讯50多道面试题问懵逼了!

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

10、volatile的特性

通过禁止指令重排序来保证内存可见性,实际使用内存屏障实现的

11、内存屏障分几种?

当时记不得了,回头查了一下如下:

LoadLoad屏障:对于这样的语句Load1; LoadLoad; Load2,在Load2及后续读取操作要读取的数据被访问前,保证Load1要读取的数据被读取完毕。

StoreStore屏障:对于这样的语句Store1; StoreStore; Store2,在Store2及后续写入操作执行前,保证Store1的写入操作对其它处理器可见。

LoadStore屏障:对于这样的语句Load1; LoadStore; Store2,在Store2及后续写入操作被刷出前,保证Load1要读取的数据被读取完毕。

StoreLoad屏障:对于这样的语句Store1; StoreLoad; Load2,在Load2及后续所有读取操作执行前,保证Store1的写入对所有处理器可见。它的开销是四种屏障中最大的。在大多数处理器的实现中,这个屏障是个万能屏障,兼具其它三种内存屏障的功能。

12、除了在volatile当中使用了内存屏障,JAVA还有哪里使用了内存屏障

这个真不知道,知道的小伙伴请在评论区指点一二

13、你之前讲到了CountDownLatch,你知道它的内部实现吗

知道,用的AQS,在state=0的时候才允许所有等待的线程全部通过

14、简单讲一下AQS

AQS核心设计:

一个volatile int state的状态值,使用volatile保证线程可见性,使用int来提供可重入的多资源能力

双向队列,首节点为执行节点,可以根据执行节点的Node信息判断是ShareLock还是ExclusiveLock,会关联一个执行线程,来提供可重入的判断

加锁的时候若是公平锁则尝试CAS载入队列,若是非公平锁则直接入队列

解锁的时候直接唤醒后继的第一个wait节点

15、加锁之后AQS是如何响应中断的?

太细节了真不会,之前复习源码没看这么深(结束之后补漏洞)

16、OK问点别的,AQS存在什么实现呢?

用过的ReentranceLock、CountDownLatch

17、讲讲实现

ReentranceLock通过判断线程是否相同进行冲入

CountDownLatch在state为0的时候才让所有的await通过

18、听说过ReadWriteLock吗,你之前提到AQS当中只有一个State那你如何用一个State去支撑读写两种状态

一个state是Int,可以分高位给Read,低位给Write,就当个String用了

19、Int几个字节

我居然回答了32个,应该是32位,8位一个byte,共计四个byte

20、你们用过缓存吗

没有,但是用redis做了分布式锁

21、你说说下分布式锁怎么做的?

分布式锁也是一个锁,需要满足几个特性,1 可重入 2 可以识别加锁的身份防止ABA问题 3 考虑是否需要续约

key是所需要加上的锁的业务资源唯一编码,value是当前线程的uuid,uuid存在threadLocal内 加锁的时候用的jedis,先设一个过期时间,然后用ex,若不存在key则添加新key,若已经存在则直接失败

解锁用的阿里云企业版的CAD(compareAndDelete),原子比较并解锁,本质是通过lua脚本进行的类似事务操作

22、除了redis还有什么可以做分布式锁?

Mysql、zookeeper等

23、如果让你用Mysql做分布式锁你怎么做

新建一张表,主键为需要锁的锁key,col1为线程uuid,col2为ttl时间

加锁的时候在一个事务中选取当前key的record,若存在则判断ttl,若不存在则直接可以插入

解锁的时候直接把record删除即可

起一个定时任务来遍历表,清楚过期键防止无限膨胀

24、zookeeper了解吗

一点点,摄入不深

25、那我们继续聊聊Redis吧,Redis有什么数据结构?

List,Hash,Set,Zset,List

26、Zset怎么实现的?

跳表+map实现

27、什么是跳表?

常规链表只有一个next节点,跳表持有多个指向其他链表的指针,可以跨越式的进行查找,时间复杂度是logn

28、如果我要找一个score为A的节点应该如何去找?

首先在map中找到对应的node排名,然后根据排名在skiplist中进行查找

29、zrange是如何实现的?

这个没想到不应该,查了一下如下: ZRANGE key start stop [WITHSCORES],zrange 就是返回有序集 key 中,指定区间内的成员,而跳表中的元素最下面的一层是有序的(上面的几层就是跳表的索引),按照分数排序,我们只要找出 start 代表的元素,然后向前或者向后遍历 M 次拉出所有数据即可,而找出 start 代表的元素,其实就是在跳表中找一个元素的时间复杂度。跳表中每个节点每一层都会保存到下一个节点的跨度,在寻找过程中可以根据跨度和来求当前的排名,所以查找过程是 O(log(N) 过程,加上遍历 M 个元素,就是 O(log(N)+M),所以 redis 的 zrange 不会像 mysql 的 offset 有比较严重的性能问题。

30、Redis持久化

RDB:快照存储,可以选择是否阻塞,使用场景在数据库上下线、主备复制等情况中

AOF:类似于binlog,每个里面都是一个写事件,是优先读取的策略,支持多策略写入(强同步、按时间刷盘、交由操作系统决定刷盘等),AOF为了防止文件膨胀也支持重写

31、AOF重写的时候会不会block主线程?

不会,没有这个必要,起一个子线程重写完毕之后把手头的buffer在刷进去就行了

32、在载入的时候是怎么做的

本地起一个client直接读取AOF重放其中的命令

33、Redis有哪些多机部署方案?

经典的主备同步,通过RDB初始化备库然后进行命令传播 Sentinel,实际上是一种容灾机制 cluster,集群部署,使用多机占用slot的方式进行集群服务提供

34、在主备环境下,如果一个备库中途断链了,重新上线的时候怎么执行同步?

主备各自维护一个写入的Offset,对比差异之后在buffer中读出丢失的命令并进行同步

35、如果备库的offset过于落后已经不在buffer当中了呢?

直接RDB重新同步 使用AOF来查找对应offset的语句(这个是我猜的)

36、cluster如何做的故障转移?

不知道,估计也是检测到客观下线然后paxos选主

37、Mysql了解吗,里面有哪些锁?

类型分类:共享锁(S),独占锁(X),意向锁(与表锁互斥)

粒度分类:行锁、表锁

38、行锁怎么实现的?

不知道,这个时候已经有点崩溃了,怎么这么多不知道nnd

39、讲一下事务隔离级别吧

RU、RC、RR、Serializable

40、你们用的是哪个隔离级别

mysql默认的是RR,我们改成RC了

41、在默认隔离级别下会产生幻读问题吗?

会,这是幻读是RR的经典问题之一

42、描述一下幻读

在T1里Select * From table where id = 1;若不存在该记录则insert id = 1的记录进去,但是在select完毕之后T2事务插入了id=1的record,此时后续insert执行失败,本质上来讲是当前的快照都不支持后续dml语句的执行

43、MVCC机制了解吗?

了解,由undolog支撑的数据隔离机制,主要是为了提供更高的并发度

44、讲一下原理

每一行record都存在两个隐藏行,一个是当前的事务id,一个是指向undolog的指针 mvcc机制运行

在rr和rc两个隔离级别下 在每次生成ReadView的时候,会将当前的活跃事务ID维护在列表当中,如果访问的Record的ID比最小活跃事务的ID还要小说明之前已经提交了,可以直接读取,如果与最大事务ID还要大就证明该事务在这个快照时没提交,需要根据undolog去找对应的历史版本,如果在最大和最小之间,那么若其为活跃事务则找历史版本,若不是则直接读取

在RC级别下,每次Select都生成新的ReadView,所以能看到不同事物间的提交

在RR级别下,只在第一次Select的时候生成ReadView,所以会产生幻读,因为快照读和真实读的结果不一致

45、慢sql怎么处理?

捞慢sql日志先分析写的索引是不是有问题或者offset太大了,然后看expain

46、你关注explain的那些col?

key:真实用到的索引

possible_key:可能用的索引

rows:扫描行数,越大越拉垮

filter:过滤数据比例,这个col可以验证索引有效性

extra:包含是否使用索引、sort是否时filesort等

47、https了解吗?

client发一个随机数给server

server发证书+随机数回来

client拆证书找第三方验证证书有效性,取出公钥

client拿公钥加密第三个随机数发server

server私钥解密

48、线上机器cpu100%你怎么处理?

容器化时代,一定要top看下是不是st过高,存在超卖的可能性

最后

本人也收藏了一份Java面试核心知识点来应付面试,借着这次机会可以送给我的读者朋友们

目录:

全靠这套面试题,才让我有惊无险美团二面拿offer  (面经解析)

Java面试核心知识点

一共有30个专题,足够读者朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!

全靠这套面试题,才让我有惊无险美团二面拿offer  (面经解析)

Java面试核心知识点

已经有读者朋友靠着这一份Java面试知识点指导拿到不错的offer了

全靠这套面试题,才让我有惊无险美团二面拿offer  (面经解析)

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

Java面试核心知识点

一共有30个专题,足够读者朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!

[外链图片转存中…(img-t5x1YTpS-1713084555980)]

Java面试核心知识点

已经有读者朋友靠着这一份Java面试知识点指导拿到不错的offer了

[外链图片转存中…(img-upQq3uhf-1713084555981)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-3RkJhmD8-1713084555981)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值