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过高,存在超卖的可能性
-
如果不是的话top看下哪个进程有问题,然后看这个进程哪个线程吃了cpu
-
jstack直接把线程dump出来然后找对应有问题的线程再分析
-
也有可能是内存泄漏导致的频繁GC问题,可以拉GClog然后在jmap把heap dump出来看下
49、你们线上JVM一般调整什么参数?
-
XMX&XMS固定防止内存抖动
-
堆空间调整:年轻代Age调整、年轻代eden:s0:s1比例调整
-
收集器调整:大促前把CMS的预清理次数调低一些,CMS的清理阈值调高一些
50、反问
-
什么团队?
-
做什么业务的?
自我反思
====
虽说这次是抱着试水的心态去的,但是这一连50问着实是有点傻眼了,而且也发现了自己的很多漏洞,如下:
-
我的简历过长,难以被面试官抓住重点
-
项目使用技术栈没有体现出来
-
涉及相关项目重难点表述不是很清楚,分布式锁、多租户的分库分表以及中间件隔离方案、性能问题排查等
-
各类技术栈停其实都还留在使用层,没有深入去挖掘
-
语速太快了,70分钟的面试大大小小回答了50个问题,我感觉放慢点够我回答两轮了
最后总结个人所得(供大家参考学习)
=================
这次一面结束之后我反思很久,发现自己真的是有很多不足和漏洞,所以最近一直在规划自己的学习路线去不足,不论你是复习备战面试还是自己学习,我相信我所说的多少还是有点用处的。
1.1 首先,第一个应该去梳理整个体系的知识大纲
========================
整个体系的知识大纲
我将整个体系分为5个专题:并发编程、性能调优、Spring全家桶、缓存数据库、分布式&微服务
1.2 其次,根据上面的分类,按照大纲来学习(最后看面试专题)
===============================
对于每一个专题,去搜集相应的面试学习笔记,比如下面我所收集的(若是对我收集的这份知识体系大纲以及下方每个专题对应的面试+学习笔记感兴趣,小编可以分享给你一起学习,
1. 并发编程(手写笔记:并发编程+并发编程_原理+并发编程_应用+并发编程_模式)
- 并发编程
并发编程
- 并发编程_原理
并发编程_原理
- 并发编程_应用
并发编程_应用
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
![img](https://i-blog.csdnimg.cn/blog_migrate/1a561d751a9fb22ae3f1fbf96805146b.jpeg)
最后
小编在这里分享些我自己平时的学习资料,由于篇幅限制,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!
程序员代码面试指南 IT名企算法与数据结构题目最优解
这是” 本程序员面试宝典!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现。针对当前程序员面试缺乏权威题目汇总这一-痛点, 本书选取将近200道真实出现过的经典代码面试题,帮助广“大程序员的面试准备做到万无一失。 “刷”完本书后,你就是“题王”!
《TCP-IP协议组(第4版)》
本书是介绍TCP/IP协议族的经典图书的最新版本。本书自第1版出版以来,就广受读者欢迎。
本书最新版进行」护元,以体境计算机网络技不的最新发展,全书古有七大部分共30草和7个附录:第一部分介绍一些基本概念和基础底层技术:第二部分介绍网络层协议:第三部分介绍运输层协议;第四部分介绍应用层协议:第五部分介绍下一代协议,即IPv6协议:第六部分介绍网络安全问题:第七部分给出了7个附录。
Java开发手册(嵩山版)
这个不用多说了,阿里的开发手册,每次更新我都会看,这是8月初最新更新的**(嵩山版)**
MySQL 8从入门到精通
本书主要内容包括MySQL的安装与配置、数据库的创建、数据表的创建、数据类型和运算符、MySQL 函数、查询数据、数据表的操作(插入、更新与删除数据)、索引、存储过程和函数、视图、触发器、用户管理、数据备份与还原、MySQL 日志、性能优化、MySQL Repl ication、MySQL Workbench、 MySQL Utilities、 MySQL Proxy、PHP操作MySQL数据库和PDO数据库抽象类库等。最后通过3个综合案例的数据库设计,进步讲述 MySQL在实际工作中的应用。
Spring5高级编程(第5版)
本书涵盖Spring 5的所有内容,如果想要充分利用这一领先的企业级 Java应用程序开发框架的强大功能,本书是最全面的Spring参考和实用指南。
本书第5版涵盖核心的Spring及其与其他领先的Java技术(比如Hibemate JPA 2.Tls、Thymeleaf和WebSocket)的集成。本书的重点是介绍如何使用Java配置类、lambda 表达式、Spring Boot以及反应式编程。同时,将与企业级应用程序开发人员分享一些见解和实际经验,包括远程处理、事务、Web 和表示层,等等。
JAVA核心知识点+1000道 互联网Java工程师面试题
企业IT架构转型之道 阿里巴巴中台战略思想与架构实战
本书讲述了阿里巴巴的技术发展史,同时也是-部互联网技 术架构的实践与发展史。
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
ng及其与其他领先的Java技术(比如Hibemate JPA 2.Tls、Thymeleaf和WebSocket)的集成。本书的重点是介绍如何使用Java配置类、lambda 表达式、Spring Boot以及反应式编程。同时,将与企业级应用程序开发人员分享一些见解和实际经验,包括远程处理、事务、Web 和表示层,等等。
[外链图片转存中…(img-IN7cQ5zB-1713291578315)]
JAVA核心知识点+1000道 互联网Java工程师面试题
[外链图片转存中…(img-cWlvSdFu-1713291578315)]
[外链图片转存中…(img-NJg1uCtX-1713291578316)]
企业IT架构转型之道 阿里巴巴中台战略思想与架构实战
本书讲述了阿里巴巴的技术发展史,同时也是-部互联网技 术架构的实践与发展史。
[外链图片转存中…(img-k96nkMnT-1713291578316)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!