我们在操作数据库的时候,可能会由于并发问题而引起的数据的不一致性(数据冲突)。如

何保证数据并发访问的一致性、有效性,是所有数据库必须解决的一个问题,锁的冲突也是

影响数据库并发访问性能的一个重要因素,从这一角度来说,锁对于数据库而言就显得尤为

重要。

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 的加载过程和原理、回收算法、以及具体使用过的框架,会问部分参数检验你是否熟用

第一面能通过,后续被录用的可能性就比较高了,第一轮非常重要,建议系统性的学习面试题目!

一面:

  1. HashMap 实现原理,ConcurrentHashMap 实现原理
  2. 红黑树,为什么允许局部不平衡
  3. TCP,UDP 区别,为什么可靠和不可靠
  4. 一次 HTTP 请求的全过程,包括域名解析、定位主机等
  5. TCP 三次握手
  6. MySQL 事务是什么?四大特性,四大隔离级别
  7. ConcurrentHashMap 和 Hashtable 区别
  8. spring IOC 和 AOP,以及各有什么优点
  9. 有哪几种常用的线程池
  10. 什么情况下使用 Runnable 和 Thread 创建线程,Runnable 和 Callable 的区别
  11. 线程方法中的异常如何处理,副线程可以捕获到吗
  12. synchronized 和锁的区别,什么情况下使用 synchronized 和 ReentrantLock
  13. JVM 的对象分配在哪个区,Class 对象分配在哪个区

二面:

  1. 常用的设计模式介绍:单例模式、装饰者模式等
  2. Java 会出现内存溢出吗?什么情况下会出现?
  3. 双亲委派模型,为什么这样做?
  4. 对象什么情况下进入老年代?
  5. 快速排序说一下过程
  6. AOP 实现原理:动态代理
  7. BIO、NIO(如何实现的)、AIO
  8. 消息中间件有哪些?他们之间的优劣势?
  9. Redis,持久化框架
  10. 栈和队列
  11. 垃圾回收算法
  12. MySQL 的索引
  13. Tomcat 类加载器
  14. OOM 内存泄漏,什么情况下会出现,如何排查

三面:

  1. 介绍你实践的性能优化案例,以及你的优化思路
  2. 微服务和 SOA 的区别,优劣势
  3. SQL 慢查询的优化方案,索引和表的优化方案。
  4. MySQL 与 MongoDB 的区别,海量数据的存储
  5. 缓存框架,例如 Redis、Memcached 之间的区别,优劣势比较
  6. 请描述一致 hash 算法
  7. 分布式 session 的共享方案有哪些,有什么优劣势
  8. 高并发情况,系统的优化方案有哪些,以及优先级排序。
  9. 面试总结

四面:

  1. ArrayList 和 linkedlist 区别。ArrayList 是否会越界。
  2. ArrayList 和 hashset 有何区别。hashset 存的数是有序的么。
  3. volatile 和 synchronized 区别
  4. 多态的原理
  5. 数据库引擎 Innodb 和 myisam 区别
  6. Redis 的数据结构
  7. Redis 是基于内存的么
  8. Redis 的 list zset 的底层实现
  9. http 和 https 的区别,tcp 握手过程
  10. jvm 垃圾回收算法手写冒泡
  11. 手写单例包括多线程下
  12. Java 线程间怎么实现同步,notify()与 notifyAll()的区别
  13. 数据库的悲观锁和乐观锁应用场景。
  14. 排序算法的复杂度,快速排序非递归实现。
  15. 海量数据过滤,黑名单过滤一个 url。

五面:

  1. list set map 底层使用什么实现的有哪些典型实现
  2. hashmap 扩容是怎么扩容的,为什么是 2 的幂
  3. concurrenthashmap 为什么线程安全,采用了什么措施应对高并发
  4. 线程池的参数有什么意义
  5. Springmvc 请求流程
  6. Spring IOC,autowired 如何实现
  7. Spring boot
  8. SpringClound 的基本架构设计
  9. Dubbo 和 SpringClound 的区别在哪里,优劣势
  10. 说说一致性 Hash 算法

六面:

  1. 分布式架构设计哪方面比较熟悉
  2. 讲讲你对 CDN 的了解,与分布式缓存和本地缓存的区别
  3. 多线程和高并发有什么区别
  4. 高并发下有哪些常用的技术解决方案,举三个高并发场景设计例子
  5. 说一个你对 JVM 优化的实际案例,包括实际步骤和方法
  6. Docker 有使用过和了解吗?Docker 和 JVM 的区别是什么?
  7. Docker 的基本架构和使用场景?
  8. 负载均衡有接触过哪些开源框架,优劣势是什么?
  9. 数据库分库分表需要怎样来实现?
  10. 数据库端的常用优化策略?
  11. 如果让你来设计秒杀系统,你的设计思路是什么,为什么要这样设计?

面试总结:

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. java 内存模型
  3. lock 和 synchronized 的区别
  4. reentrantlock 的实现
  5. hashmap 和 concurrenthashmap
  6. B+树和 B-树的区别
  7. 复合索引
  8. 聚集索引和非聚集索引的区别?
  9. 数据库索引 主键和唯一索引有什么区别索引失效条件,什么时候该建立索引
  10. innDB 和 MyISAM 的区别?
  11. 线程安全(阻塞同步,非阻塞同步,无同步)

三面

  1. 主要高并发和分布式架构设计
  2. 服务器模型以及之间的区别
  3. 线程池的设计
  4. 线程池如何做负载均衡
  5. 如何实现线程调度算法
  6. 复合索引是如何实现的?
  7. 如何设计单点登录,单点登录的原理
  8. redis 缓存和 memcached 缓存的区别,以及各自的优劣势
  9. 大型高并发网站如何做性能优化:Web 性能、数据库性能、应用服务器性能等。
  10. 实践中如何优化 MySQL:SQL 语句及索引的优化、数据库表结构的优化、系统配置的优化、
  11. 硬件的优化
  12. 分库分表和读写分离如何设计
  13. 微服务架构:dubbo 和 springcloud 的区别,以及各自对应的使用场景。

淘宝一面:

面试介绍

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. 数据库事务属性

以上就是完整的阿里技术面试题目、以及阿里面试经验总结,希望对你有所帮助!

面试答案!

面试答案整理出来了,这次技术面试针对的岗位是阿里P8,各位可以比较一下!