2020秋招Java面试题汇总

一、Java基础

  1. JDK1.6对Synchronized做了哪些优化?底层原理是什么?
    答:JDK1.6之前,Synchronized默认是重量级锁。而在JDK1.6之后,对synchronized优化,根据不同情形出现了偏向锁、轻量锁、自旋锁(或自适应自旋锁)、重量级等,因此,现在的synchronized可以说是一个几种锁过程的封装。根据不同的场景对锁进行膨胀,但是只能向上升级,不能向下退化。
  2. 对各个锁稍微解释一下吧。什么情况下会膨胀?
    答:偏向锁是默认只有一个线程去访问临界资源,对象头Mark Word的锁标志位为01,偏向锁相当于没有加锁,类似乐观锁,只是记录了获得该锁的线程ID;如果下一次获取临界资源的线程是同一个线程或者上一个线程已经消亡了,则保持偏向锁,如果不是则升级为轻量级锁。轻量级锁的规则是默认每个线程获取临界资源的时间是错开的,所以并不会产生竞争的情况。如果发生了竞争,就乐观的认为只是上一个线程出了点小意外,于是就升级为自旋锁,自旋锁遇到竞争的情况,会先自身死循环一段时间,等待上一个线程释放临界资源,因为死循环会浪费CPU资源,不能一直等下去,等不下去了,就升级为重量级锁
    偷个图:
    2020秋招Java面试题汇总_第1张图片
  3. 刚刚提及的对象头是什么?还有其它的相关熟悉吗?
    答:虚拟机中对象存储分成三块区域,对象头(Header),实例数据(Instance Data),对齐填充(Padding)。
    对象头:对象头记录对象的信息,包括哈希码,GC分代年龄,锁状态标志,线程持有的锁,偏向时间戳,类型指针。
    实例数据:存储对象自身定义的数据
    对齐填充:为了对齐填充的额外数据。
    (这块可以自行再深入了解)
  4. HashMap 1.7和1.8的区别是什么?做了哪些优化?
    答:自行查阅
  5. HashMap的线程不安全性体现在哪里?
    答:1、值的覆盖问题 2、形成链环,查询的时候会死循环
  6. 为什么要转成红黑树?取值为什么取8?
  7. ConcurrentHashMap 的实现原理
  8. ConcurrentHashMap 1.7和1.8的区别
  9. final关键字的意义?是否可变?
  10. volatile关键字的意义?
  11. volatile和synchronized的区别?

二、框架

三、数据库

  1. MySQL常用的数据引擎及其区别?
  2. 你对一级索引和二级索引的理解?
  3. 二级索引的执行过程?
  4. explain的使用?
  5. 数据库乐观锁和悲观锁的使用场景?
  6. 有一个一亿大小的表,你要如何优化这个表?

四、中间件

  1. Redis的更新策略?
  2. 缓存的意义?
  3. 消息队列的应用场景?
  4. kafka是怎么保证消息的幂等性的?
  5. zookeeper与kafka的关系?
  6. zookeeper还有什么功能?

五、分布式

  1. 分布式锁有了解过吗

六、操作系统和计算机网络

  1. 进程和线程的区别?
  2. 进程间的通信方式?
  3. TCP协议和UDP协议的区别?
  4. 你所知道的TCP协议
  5. UDP的不可靠性体现在哪里?
  6. MTU是什么?
  7. TCP数据包和UDP数据包的大小应该怎么定义?
  8. 有没有尝试过优化UDP的可靠性?

后续继续完善答案~

你可能感兴趣的:(Java,基础知识)