发布于 

快手商业化Java后端实习面经

一面

Q: JVM的内存架构?

Q: IO这里了解吗?

Q: 多线程呢? 线程池怎么创建? 线程有哪些状态? 为什么选择多线程而非多进程?

Q: 设计原则有哪些?

Q: TCP和UDP的区别是什么? TCP的拥塞控制了解吗? 滑动窗口模型?
A: TCP流量控制和拥塞控制
超时与重传机制
发送窗口 = Min(接收窗口, 拥塞窗口)

Q: 数据库索引有哪些? 为什么用B+树? 索引缺失了解吗?
A: (我把数据库索引和引擎记混了)

Q: MySQL的四种隔离级别了解吗?

Q: 解释一下可重复读?

Q: hashmap和concurrenthashmap底层分别是怎么实现的?

代码题:

一个班考试成绩mysql存储,表结构如下:

create table stu_score (

id bigint unsigned NOT NULL comment ‘学号’,

type varchar(16) NOT NULL DEFAULT ‘’ comment ‘考试科目’,

score double(16,2) DEFAULT ‘0’ comment ‘考试分数’

)

要求一条sql分别完成如下统计:

1.求科目为数学(type=math)最高分的对应的学号

2.科目为数学(type=math)的及格率(60分以上的人数与总人数的比例)

select anum/ bnum from (SELECT count(*) as anum
FROM stu_score
WHERE type=math AND score >= 60) a, (SELECT count(*) as bnum
FROM stu_score
WHERE type=math) b

问了关于Java的很多问题, 但是我都还没准备到…

所以这里先对照Java Guide学习一下并发编程的部分.

二面

简历挖掘, 中科院那段算法经历疯狂挖掘.

面试中需要补充的知识点

Java并发常见面试题

  1. 什么是线程和进程?
    多个线程共享进程的堆和方法区资源,但每个线程有自己的程序计数器、虚拟机栈和本地方法栈.
    一个 Java 程序的运行是 main 线程和多个其他线程同时运行.
  2. 请简要描述进程和线程的关系, 区别, 和优缺点?
    总结: 线程是进程划分成的更小的运行单位。线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有可能会相互影响。线程执行开销小,但不利于资源的管理和保护;而进程正相反。
  3. 并发和并行的区别?
  4. 同步和异步的区别?
  5. 为什么要使用多线程?
  6. 使用多线程可能带来什么问题?
    内存泄漏、死锁、线程不安全.
    内存泄漏: 垃圾回收器会回收长时间没有引用的对象,但是它不会回收那些还存在引用的对象,这就是产生内存泄漏的原因。
  7. 说说线程的生命周期和状态?
  8. 什么是线程上下文切换?
  9. 什么是线程死锁?
  10. 如何预防和避免死锁?
  11. sleep方法和wait方法对比.
  12. 为什么wait方法不定义在Thread中?
  13. 可以直接调用Thread类的run方法吗?

JMM模型

  1. 什么事JMM? 为什么需要JMM?
  2. JMM如何抽象线程和主存间的关系?
  3. happens-before的原则是什么?
    happens-before 原则表达的意义其实并不是一个操作发生在另外一个操作的前面,虽然这从程序员的角度上来说也并无大碍。更准确地来说,它更想表达的意义是前一个操作的结果对于后一个操作是可见的,无论这两个操作是否在同一个线程里。
  4. 并发编程的三个特性是什么? 怎样理解?
    原子性, 可见性, 有序性

volatile 关键字

  1. 如何保证变量的可见性?
  2. 如何禁止指令重排序?
  3. volatile 可以保证原子性吗?
    volatile 关键字能保证数据的可见性, 但不能保证数据的原子性. synchronized 关键字两者都能保证.

乐观锁和悲观锁

  1. 什么是悲观锁?
    共享资源每次只给一个线程使用, 其它线程阻塞, 用完后再把资源转让给其它线程.
    像 Java 中synchronized和ReentrantLock等独占锁就是悲观锁思想的实现.
  2. 什么是乐观锁?
    线程可以不停地执行,无需加锁也无需等待,只是在提交修改的时候去验证对应的资源(也就是数据)是否被其它线程修改了(具体方法可以使用版本号机制或 CAS 算法)
    在 Java 中java.util.concurrent.atomic包下面的原子变量类(比如AtomicInteger、LongAdder)就是使用了乐观锁的一种实现方式 CAS 实现的。
  3. 如何实现乐观锁?
    版本号机制和CAS算法.
  4. 乐观锁存在哪些问题?
    ABA问题, 循环时间长开销大(自旋), 只能保证一个共享变量的原子操作.

Synchronized 关键字

  1. synchronized 是什么? 有什么用?
  2. 如何使用Syncronized?
  3. synchronizedvolatile 有什么区别?

IO

IO流

  1. 什么是IO流?
    IO 流在 Java 中分为输入流和输出流,而根据数据的处理方式又分为字节流和字符流。

字节流

字符流

字节缓冲流

字符缓冲流

打印流

随机访问流

JVM

<重点>JVM内存区域详解

<重点>JVM垃圾回收详解