大家好,又见面了,我是你们的朋友全栈君。
我们在操作数据库的时候,可能会由于并发问题而引起的数据的不一致性(数据冲突)。如
何保证数据并发访问的一致性、有效性,是所有数据库必须解决的一个问题,锁的冲突也是
影响数据库并发访问性能的一个重要因素,从这一角度来说,锁对于数据库而言就显得尤为
重要。
MySQL 锁概述
相对其他数据库而言,MySQL 的锁机制比较简单,其最显著的特点是不同的存储引擎支持
不同的锁机制。
比如:
MyISAM 和 MEMORY 存储引擎采用的是表级锁(table-level locking);
InnoDB 存储引擎既支持行级锁( row-level locking),也支持表级锁,但默认情况下是采
用行级锁。
MySQL 主要的两种锁的特性可大致归纳如下:
阿里 P8 架构师谈:MySQL 行锁、表锁、悲观锁、乐观锁的特点与应用
表级锁: 开销小,加锁快;不会出现死锁(因为 MyISAM 会一次性获得 SQL 所需的全部锁);
锁定粒度大,发生锁冲突的概率最高,并发度最低。
行级锁: 开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度
也最高。
页锁:开销和加锁速度介于表锁和行锁之间;会出现死锁;锁定粒度介于表锁和行锁之间,
并发度一般
行锁 和 表锁
1.主要是针对锁粒度划分的,一般分为:行锁、表锁、库锁
(1)行锁:访问数据库的时候,锁定整个行数据,防止并发错误。
(2)表锁:访问数据库的时候,锁定整个表数据,防止并发错误。
2.行锁 和 表锁 的区别:
表锁: 开销小,加锁快,不会出现死锁;锁定力度大,发生锁冲突概率高,并发度最低
行锁: 开销大,加锁慢,会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高
悲观锁 和 乐观锁
(1)悲观锁:顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次
在拿数据的时候都会上锁,这样别人想拿这个数据就会 block 直到它拿到锁。
传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都
是在做操作之前先上锁。
(2)乐观锁: 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不
会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本
号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于
write_condition 机制的其实都是提供的乐观锁。
(3)悲观锁 和 乐观锁的区别:
两种锁各有优缺点,不可认为一种好于另一种,像乐观锁适用于写比较少的情况下,即冲突
真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。但如果经常产
生冲突,上层应用会不断的进行 retry,这样反倒是降低了性能,所以这种情况下用悲观锁
就比较合适。
共享锁
共享锁指的就是对于多个不同的事务,对同一个资源共享同一个锁。相当于对于同一把门,
它拥有多个钥匙一样。就像这样,你家有一个大门,大门的钥匙有好几把,你有一把,你女
朋友有一把,你们都可能通过这把钥匙进入你们家,这个就是所谓的共享锁。
刚刚说了,对于悲观锁,一般数据库已经实现了,共享锁也属于悲观锁的一种,那么共享锁
在 mysql 中是通过什么命令来调用呢。通过查询资料,了解到通过在执行语句后面加上 lock
in share mode 就代表对某些资源加上共享锁了。
什么时候使用表锁
对于 InnoDB 表,在绝大部分情况下都应该使用行级锁,因为事务和行锁往往是我们之所以
选择 InnoDB 表的理由。但在个别特殊事务中,也可以考虑使用表级锁。
第一种情况是:事务需要更新大部分或全部数据,表又比较大,如果使用默认的行锁,不
仅这个事务执行效率低,而且可能造成其他事务长时间锁等待和锁冲突,这种情况下可以考
虑使用表锁来提高该事务的执行速度。
第二种情况是:事务涉及多个表,比较复杂,很可能引起死锁,造成大量事务回滚。这种
情况也可以考虑一次性锁定事务涉及的表,从而避免死锁、减少数据库因事务回滚带来的开
销。
当然,应用中这两种事务不能太多,否则,就应该考虑使用 MyISAM 表了。
表锁和行锁应用场景:
表级锁使用与并发性不高,以查询为主,少量更新的应用,比如小型的 web 应用;
而行级锁适用于高并发环境下,对事务完整性要求较高的系统,如在线事务处理系统。
BAT 技术面试范围
数据结构与算法:最常见的各种排序,最好能手写
Java 高级:JVM 内存结构、垃圾回收器、回收算法、GC、并发编程相关(多
线程、线程池等)、NIO/BIO、各种集合类的比较优劣势(底层数据结构也要
掌握,特别是扩容等)等。
性能优化、设计模式、UML 的掌握
Spring 框架:重点掌握(BAT 每次必问)
分布式相关:Redis 缓存、一致 Hash 算法、分布式存储、负载均衡等。
微服务以及 Docker 容器等。
阿里面试总结
阿里的面试特别喜欢面试技术原理,特别是、多线程、NIO、异步消息框架、分布式相关的缓存算法等、JVM 的加载过程和原理、回收算法、以及具体使用过的框架,会问部分参数检验你是否熟用
第一面能通过,后续被录用的可能性就比较高了,第一轮非常重要,建议系统性的学习面试题目!
一面:
二面:
三面:
四面:
五面:
六面:
面试总结:
java 的基础知识点,主要围绕在集合类和多线程等:ArrayList、LinkedList、HashSet、HashpMap的数据结果,以及如何扩容、以及 ConcurrentHashMap 相关的多线程安全等。
JVM 的内存分配、几个常见的垃圾回收算法以及原理、还有对应的 JVM 优化参数需要牢记。
网络:TCP 的三次握手等网络都必问,重点掌握网络协议。
Redis:作为分布式缓存的主力,基本也是 BAT 每次必考,重点是 Redis 的数据结构、内存、
算法、持久化,以及与别的缓存 memcached 的优劣势。
多线程:状态流转、多线程的实现,以及与高并发的区别等。
Spring 框架问得是最多的,BAT 非常喜欢问,重点掌握。
最后就是分布式架构设计
常用的分布式架构设计方案:单点登录、分布式缓存、存储、消息的选型,还有就是数据
库端的优化方案(需要提前了解)。
最好能提前了解深入一个类似秒杀这样的项目,如果面试官问到类似的项目,你能把设计
思路讲出来,这对你的面试结果是很大的加分项。
一面
1.自我介绍
2.谈一个你觉得你学到最多的项目,使用了什么技术,挑战在哪里3.Spring 的 bean 的作用域?(比如:singleton,prototype 等)
4.Spring 的 IOC 实现原理?没有无参构造函数能实例化吗?有参构造函数注入?(xml 配置)
5.通过反射,谈到了方法区,然后,类加载机制?
6.synchronized 的实现原理?Volatile 能保证原子性吗?为什么?
7.hashmap 和 concurrenthashmap 的 size 方法怎么实现的
8.JVM 的调优参数?(-Xmn,-Xms 等具体参数设置)
9.线程池优点,参数,如果我想实现 newSingleThreadPoll,应该怎么配置,构造方法传什么
参数
10.mysql 死锁,怎么解决,如果不要求执行顺序,死锁怎么解决
11.ioc 和 aop 原理
12.线程的五态?转化过程?
13.TCP 三次握手,为什么三次握手?
14.JVM 内存分区?(主存,工作内存,堆,栈。。。。)
15.讲一下 GC?
16.为什么要用老年代和新生代?
17.新生代进入老生代的情况?
18.新生代的分区?
二面
三面
淘宝一面:
面试介绍
1)自我介绍?
2)项目介绍?
3)遇到的最大困难是什么?怎么解决的?
4)你觉得你能怎么优化这个项目?
面试题目
1)讲一下 JVM
2)讲一下 JVM 的分代回收以及具体算法
3)将一下 JVM 的垃圾收集器,G1 和 CMS 有啥区别?
4)讲一下一个变量从产生到结束所经历的过程,讲一下字符串常量的过程?
5)将一下线程安全问题产生的原因?
6)讲一下乐观锁和悲观锁7)乐观锁是怎么保证一致性的
8)Integer 和 int 有啥区别,integer 中有哪些特殊的函数?
9)讲一下数据库的隔离等级
10)说一下 MVCC
11)说一聚簇索引和非聚簇索引的有什么不同
淘宝二面:
1、问了冒泡排序,快排,和归并排序及优缺点和优化
2,网络方面有 osi 七层,tcp/ip 五层,分别有哪些协议及作用
3,爬虫用的什么数据结构
4、tcp 的流量控制和拥塞控制
5,mysql 用的什么存储引擎,这个存储引擎用的什么数据结构 ,有哪些优缺点,怎么使用
6,jvm 的垃圾回收机制和垃圾收集器
7、spring 当中事物的隔离级别
8、jdk1.8 concurrenthashmap 的新的特性,有没有看过源码
9、 threadlocal 了解吗
10,问了 redis 的一些问题,项目中有(扩容,失效 key 清理策略等)
11,剩下的都是项目的东西(kafka filebeat elk 原理,主从选举,复制等)
12,后面扩展的问了一些大数据相关的,问我一些大数据处理框架是否有了解
整个过程四十分钟左右
淘宝三面
主要项目,你做过哪些项目,用过哪些技术?了解哪些框架?你觉得对你技术提升最高的是
哪一件事情,提升了你哪一方面的技术?
1)讲一下 Spring AOP 和 IOC 的底层实现
2)说一下 hashcode 的作用?HashMap 的底层实现?HashMap 和 HashTable 的区别3)说一下 concurrentHashMap 和 hashTable 在性能上的区别?以及这种差异形成的原因
4)讲一下堆以及堆排序
5)说一下 B+tree 和二叉搜索树的区别?说一下二叉搜索树和 AVL 树、红黑树之间的差别
6)给你两个文件(字符串形式的)如何找出他们之间的不同地方?
7)你刚刚说的能怎么优化?
淘宝四面 交叉面
本来以为三面结束就是 hr 面了,又收到一面交叉面
1. 给你 50 亿行字符串,机器 4G 内存(只能一台机器),找出重复次数最多的那行字符串?
(以行为单位,每行不超过 10 个字符)
2.设计一个算法,实现两个 10g 大文件在 10m 的内存中将两个大文件中重复的放进第三个
文件
3. 快速排序的平均复杂多少?最坏情况是什么?(这个题估计就是缓和一下尴尬的气氛)
支付宝一面
4. 介绍一下自己。
5. 项目参与的核心设计有哪些
6. ArrayList 和 LinkedList 底层
7. HashMap 及线程安全的 ConcurrentHashMap,以及各自优劣势
8. Java 如何实现线程安全
9. Synchronized 和 Lock 哪个更好?
10. HashMap 中的 get()方法是如何实现的?
11. HashMap 可以用在哪些场景?
12. JVM,垃圾回收机制,内存划分等
13. SQL 优化,常用的索引?
14. 还有什么问题需要问的。
支付宝二面
16. 没有自我介绍,直接问做过哪些 Java 开发相关的项目。
17. 对哪些技术比较熟悉?
18. 多线程状态图,状态如何流转?
19. 死锁,死锁原因
20. 页锁、乐观锁、悲观锁?
21. 乐观锁如何保证线程安全?
22. 用过线程池吗,对应的好处,如何用?
23. 两个 10G 的文件,里面是一些 url,内存只有 1G,如何将这两个文件合并,找到相同
的 url?
24. 1000 个多并发线程,10 台机器,每台机器 4 核的,设计线程池大小。25. 代码题:两个有序数组,数组中存在重复数字,合并成一个有序数组,去除重复数字。
26. 说一下自己的优点。
支付宝三面
28. jvm 性能调优都做了什么
29. 数据库性能调优如何做
30. 分布式系统原理:CAP,最终一致性,幂等操作等
31. 高并发情况下,我们系统是如何支撑大量的请求的
32. 集群如何同步会话状态
33. 常用 NOSQL,有做过比较?
34. 什么情况会出现雪崩,以及如何应对?
35. 负载均衡的原理
36. 数据库事务属性
以上就是完整的阿里技术面试题目、以及阿里面试经验总结,希望对你有所帮助!
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/125225.html原文链接:https://javaforall.cn