记一次京东电话面试

1,HashMap在扩容场景下,高并发请求多个线程过来,会出现什么情况?

  • 在扩容resize方法中调用了transfer()方法,而这种方法实现的机制就是将每一个链表转化到新链表,而且链表中的位置发生反转,而这在多线程情况下是非常easy造成链表回路。从而发生get()死循环

答案
链表回路
答案

2,自定义线程池corePoolSize,maximumPoolSize,workQueue,RejectedExecutionHandler这四个参数怎么配合使用的?

线程流转图
l 如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,要创建新的线程来处理被添加的任务。

2 如果此时线程池中的数量等于 corePoolSize,但是缓冲队列 workQueue未满,那么任务被放入缓冲队列。

3 如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolSize,建新的线程来处理被添加的任务。

4 如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maximumPoolSize,那么通过 handler所指定的策略来处理此任务。也就是:处理任务的优先级为:核心线程corePoolSize、任务队列workQueue、最大线程maximumPoolSize,如果三者都满了,使用handler处理被拒绝的任务。

当线程池中的线程数量大于 corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止。这样,线程池可以动态的调整池中的线程数。

线程拒绝策略:

相关链接

  1. ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出ejectedExecutionException异常。
  2. ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。
  3. ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,执行后面的任务
  4. ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务
    相关链接

解释

3,什么场景下适合使用cms收集器?

收集器使用场景

  • CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。目前很大一部分的Java应用集中在互联网站或者B/S系统的服务端上,这类应用尤其重视服务器的响应速度,希望系统停顿时间最短,以给用户带来较好的体验。CMS收集器就非常符合这类应用的需求

4,CMS和G1有什么区别?

相关解释

5,jvm调优的时候有什么心得没有?

相关链接
未完善

6,一台实例CPU使用100%,怎么查?

相关连接
jstack 生成线程信息

7,lock和synchronized区别?

相关答案
相关答案

8,mysql乐观锁和悲观锁?

不可不说的Java“锁”事
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

9,mysql分库分表,什么时候适合分表?什么情况适合分库?

相关答案
在这里插入图片描述

10,缓存穿透?

  1. 布隆过滤器
  2. 缓存null字符串,设置过期时间
  3. 双重检测同步锁

11,Redis solt槽的概念?

12,redis 分布式锁?

在这里插入图片描述
相关代码地址

了解下ThreadLocal 用于保存某个线程共享变量
相关视频
在这里插入图片描述

3,rpc原理?你自己能设计一个rpc吗?

rpc原理
rpc实现

14,主键索引和二级索引(普通索引)有什么区别?主键索引为什么比普通索引快

如果不是覆盖索引,普通索引需要再查一遍聚集索引,才能拿到数据
相关答案
相关地址

15,搜索从大局看分为哪几块?

16,es ,分词,排序?

17,项目中使用的设计模式,代理模式,反射,单例模式?

18,spring ioc和aop的原理,怎么实现的?