wmhqnyh / java_Interview

自己模拟一下面试,按照题目顺序自己问自己!

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

java_Interview

看目录自己面试,答案在下边,会慢慢补充。

并发

基础

1.线程进程含义&关系&区别&优缺点

进程 - 程序的一次执行过程 ,是系统运行程序的基本单位 是动态的

线程 - 一个进程在执行过程中可以产生多个线程,同类的多个线程共享进程的堆和方法区资源,每个线程有自己的程序计数器/虚拟机栈/本地方法栈。产生一个线程,各个线程之间切换工作,负担会比进程小得多

2.并发与并行的区别

3.为何使用多线程 可能带来的问题

4.线程的生命周期和状态

5.什么是上下文切换

6.线程死锁?如何避免?

7.sleep()方法和wait()方法的区别/共同点

8.是否可以直接调用run() 不限start()再run()?

9.用过CAS吗?会发生什么问题?怎么解决?

10.如何创建多线程?

synchronized

1.谈谈自己对于synchronized关键字的了解

2.谈谈自己是怎么使用此关键字

3.构造方法可以使用他修饰吗

4.谈下底层原理

5.谈下1.6后底层做了哪些优化,详细介绍一下

6.谈谈synchronized和ReentrantLock区别

volatile

1.CPU缓存模型

2.讲一下JMM

3.并发编程的三个重要特性

4.介绍一下对此关键字的理解

5.synchronized 与volatile 的区别

ThreadLocal

1.介绍一下是什么及原理、运用场景

2.ThreadLocal 内存泄漏的问题

线程池

1.为什么要使用线程池

2.实现Runnable和Callable接口的区别

3.execute() 与submit() 区别

4.如何创建线程池

5.ThreadPoolExecutor类分析

6.谈下原理

7.谈一下线程池七大参数及拒绝策略?

Atomic 原子类

1.介绍一下,不使用它会有什么问题 ..

2.JUC包中的原子类是哪四类

3.讲讲AtomicInteger的使用

4.简单介绍一下AtomicInteger类的原理

AQS

1.介绍一下AQS

2.AQS原理分析

3.组件

Reference

1.谈一下强软弱虚引用,各有哪些应用场景?

JUC

1.用过CountDownLatch、CyclicBarrier、Semaphore吗 什么场景用的?有什么区别?能否复用?

2.聊一下HashMap底层原理,有过什么变化,会发生什么问题?对应的支持高并发的类聊下原理?

3.聊一下线程安全的list、set,底层原理(CopyOnWriteArrayList、CopyOnwriteArraySet)

4.聊一下ConcurrentSkipListMap,有哪些应用场景

5.Feture接口是怎么使用的?

6.聊一下锁机制?什么是非公平锁/公平锁/可重入锁/互斥锁?

7.阻塞队列和非阻塞队列有什么区别?有哪些运用场景?

Mysql

架构相关

1.结合MySQL架构,聊一下SQL的执行过程

2.缓存和缓冲

3.谈谈Mysql的储引擎

4.怎么理解Mysql对于sql的执行时基于成本模型的

5.优化器是怎么运行的,为什么会有错误的决定

Schema

1.谈谈数据的范式,为什么需要范式

2.字段有哪些类型

3.为什么设定主键,选用什么类型

4.水平分表和垂直分表 解释一下?

索引

1.有哪些类型,逻辑分类和物理分类有哪些

2.为什么使用索引

3.索引采用了哪些数据结构,分别有什么特征

4.like查询可以走索引

5.不建议对哪些字段建索引

6.Mysql是如何建立索引的

7.哪些场景会导致索引失效

8.如何创建/使用高性能的索引

9.索引对null值是如何处理的

事务

1.隔离级别有哪些,分别会存在什么问题

2.事务的特征及实现

3.分布式事务解决方案

日志

1.redo log 和bin log 有什么区别

2.事务提交时,redo log和binlog的写入顺序是怎样的

3. redo log什么时候释放?undo log什么时候释放?

4. 什么是write-Ahead Log策略?

5. bin log记录日志有哪些方式?常用哪种?为什么?各有什么优劣势?

1. 数据库中有哪些锁,有什么作用,有什么弊端?

2. latch 和 lock 有什么区别

3. RC 和 RR 在加锁方面有什么不同?

4. 什么是死锁,怎么避免死锁?有没有遇到死锁?

5. 如何查看死锁信息?

6. 发生死锁怎么办?怎么处理?

7. MYISAM 和 InnoDB 是怎么支持并发插入的?

8. 怎么理解latch中的自旋锁?比较下Java中的自旋锁

Innodb

1. 什么是缓冲池?有什么用?

2. 聊一聊LRU算法,InnoDB是怎么实现LRU的?

3. 聊一聊InnoDB架构,各组成部分有什么用?

4. 脏页刷盘机制是什么?

5. 聊一下伙伴内存分配系统

6. 聊一下InnoDB的关键特性

Other fun question

1.一条SQL语句执行得很慢的原因有哪些

2.大表优化方案

Redis

应用场景及数据结构算法

1.简述缓存的基本**

  • 可以提高系统性能以及减少请求响应时间。基本**是空间换时间,cpu缓存的是内存数据-用于解决CPU运算速度和内存读写速度不匹配的问题 内存缓存的是硬盘的数据 用于解决硬盘访问速度过慢的问题 操作系统在页表方案基础上引入快表加速虚拟地址到物理地址的转换 那么块表可以理解为一种特殊的高速缓冲存储器。从业务的角度,为了避免用户在请求数据时获取速度过于缓慢,在数据库之上增加了缓存

2.为什么要用分布式缓存 - 不直接用本地缓存

  • 本地缓存对分布式架构支持不友好 - 本地缓存只在当前机器上 同一个相同服务部署在多台服务器上,各个服务之间的缓存无法共享
  • 本地缓存容量受服务器部署所在的机器限制 - 如果当前系统服务耗费的内存多,本地缓存可用的容量就很少

使用分布式缓存后,缓存部署在一台单独的服务器上,即使同一份服务部署在多台服务器上,使用的是同一份缓存。单独分布式缓存服务的性能 容量和提供的功能都要强大

3.简单介绍一下redis

c语言开发的数据库,数据是存放在内存中的,所以读写速度非常快。被广泛用于缓存方向,除此之外 经常被用来用分布式锁/消息队列等 提供了多种数据类型来支持不同的业务场景,支持事务/持久化/Lua脚本/多种集群方案

4.redis和memcached的区别和共同点

https://github.com/Snailclimb/JavaGuide/blob/master/docs/database/Redis/redis-all.md

5.为什么要用缓存/为什么要用redis

6.redis给缓存数据设置过期时间有啥用

7.redis可以实现事务吗?如何实现的

8.如何利用Redis实现乐观锁?

9.了解Redis的管道吗?有什么好处?

10.谈一下缓存穿透

11.谈一下缓存击穿

12.谈一下缓存雪崩

13.Redis有一个分布式锁,有什么弊端?怎么解决?

14.如何保证缓存和数据库数据的一致性?

15.Redis中,big key有哪些危害?怎么避免?

16.常见数据结构及使用场景

17.为什么Redis选择使用跳表而不是红黑树来实现有序集合?

18.聊一下ziplist、quicklist、intset

19.聊一下Hyperloglog

20.什么是一致性哈希算法?什么是哈希槽?

21.keys * 有什么风险?该怎么解决?

22.如何用Redis实现一个延时队列?

23.如何用Redis实现购物车功能?

24.如何用Redis实现微信微博点赞功能?

25.如何用Redis实现微博关注功能中,你可能认识的人?你和他的共同好友?

26.如何利用Redis实现微信抽奖功能?一次抽奖抽出六个人 或 多次抽奖包含三等奖、二等奖、一等奖

27.如何利用Redis实现微博热搜?

28.如何利用Redis实现电商中,根据各个标签筛选商品?一个商品可能涉及多个标签

29.如何利用Redis实现附近的人?

30.Redis中有一个限流模块,了解过吗?谈一下几大限流算法

31.怎么设计一套秒杀系统?

工作机制

1.缓存读写模式及更新策略

  • Cache Aside Pattern(旁路缓存模式)

写:更新 DB,然后直接删除 cache 。

读:从 cache 中读取数据,读取到就直接返回,读取不到的话,就从 DB 中取数据返回,然后再把数据放到 cache 中。

Cache Aside Pattern 中服务端需要同时维系 DB 和 cache,并且是以 DB 的结果为准。另外,Cache Aside Pattern 有首次请求数据一定不在 cache 的问题,对于热点数据可以提前放入缓存中。

Cache Aside Pattern 是我们平时使用比较多的一个缓存读写模式,比较适合读请求比较多的场景。

  • Read/Write Through Pattern(读写穿透)

Read/Write Through 套路是:服务端把 cache 视为主要数据存储,从中读取数据并将数据写入其中。cache 服务负责将此数据读取和写入 DB,从而减轻了应用程序的职责。

  1. 写(Write Through):先查 cache,cache 中不存在,直接更新 DB。 cache 中存在,则先更新 cache,然后 cache 服务自己更新 DB(同步更新 cache 和 DB)。
  2. 读(Read Through): 从 cache 中读取数据,读取到就直接返回 。读取不到的话,先从 DB 加载,写入到 cache 后返回响应。

Read-Through Pattern 实际只是在 Cache-Aside Pattern 之上进行了封装。在 Cache-Aside Pattern 下,发生读请求的时候,如果 cache 中不存在对应的数据,是由客户端自己负责把数据写入 cache,而 Read Through Pattern 则是 cache 服务自己来写入缓存的,这对客户端是透明的。

和 Cache Aside Pattern 一样, Read-Through Pattern 也有首次请求数据一定不再 cache 的问题,对于热点数据可以提前放入缓存中。

  • Write Behind Pattern(异步缓存写入)

Write Behind Pattern 和 Read/Write Through Pattern 很相似,两者都是由 cache 服务来负责 cache 和 DB 的读写。

但是,两个又有很大的不同:Read/Write Through 是同步更新 cache 和 DB,而 Write Behind Caching 则是只更新缓存,不直接更新 DB,而是改为异步批量的方式来更新 DB。

Write Behind Pattern 下 DB 的写性能非常高,尤其适合一些数据经常变化的业务场景比如说一篇文章的点赞数量、阅读数量。 往常一篇文章被点赞 500 次的话,需要重复修改 500 次 DB,但是在 Write Behind Pattern 下可能只需要修改一次 DB 就可以了。

但是,这种模式同样也给 DB 和 Cache 一致性带来了新的考验,很多时候如果数据还没异步更新到 DB 的话,Cache 服务宕机就 gg 了。

2.为什么redis选择单线程模型

https://draveness.me/whys-the-design-redis-single-thread/

3.缓存淘汰机制了解吗?有什么算法?

(LRU+贪心算法)

4.谈一下Redis的内存回收机制

(数据页)

5.如何判断数据是否过期的及过期数据的删除策略

6.主从架构中,怎么执行删除过期key的?

7.怎么保证redis挂掉之后再重启数据可以进行恢复(redis的持久化)

7.谈一下AOF中,AOF重写的目的

8.Redis是怎么实现RDB的?聊一下fork子进程的工作过程

9.RDB中,save 和 bgsave有啥区别?

10.能解释下什么是RESP?有什么特点?Redis是怎么用的?

集群

1.redis主从怎么复制的?有哪些方案?

2.从节点挂掉之后重新启动,怎么跟主节点保持一致?会有什么问题吗?

3.谈一下Redis集群方式。sentinel工作原理?Redis cluster工作原理?

4.谈一下 CAP,Redis符合哪些?为什么?

5.sentinel 和 Redis cluster对比一下,有哪些优缺点?

6.谈一下Redis cluster中槽位是怎么转移的?

7.Redis cluster中,-MOVED 和 -asking的区别?

8.Redis cluster中,客户端会缓存一份槽位信息映射表。当槽位发生变化后,客户端是怎么感知的?

9.集群节点变更后,客户端是怎么感知的?

10.Redis cluster是怎么处理网络抖动的?

11.谈一下Redis cluster中的 GOSIP 协议

About

自己模拟一下面试,按照题目顺序自己问自己!