快手商业化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 |
问了关于Java的很多问题, 但是我都还没准备到…
所以这里先对照Java Guide学习一下并发编程的部分.
二面
简历挖掘, 中科院那段算法经历疯狂挖掘.
面试中需要补充的知识点
Java并发常见面试题
- 什么是线程和进程?
多个线程共享进程的堆和方法区资源,但每个线程有自己的程序计数器、虚拟机栈和本地方法栈.
一个 Java 程序的运行是 main 线程和多个其他线程同时运行. - 请简要描述进程和线程的关系, 区别, 和优缺点?
总结: 线程是进程划分成的更小的运行单位。线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有可能会相互影响。线程执行开销小,但不利于资源的管理和保护;而进程正相反。 - 并发和并行的区别?
- 同步和异步的区别?
- 为什么要使用多线程?
- 使用多线程可能带来什么问题?
内存泄漏、死锁、线程不安全.
内存泄漏: 垃圾回收器会回收长时间没有引用的对象,但是它不会回收那些还存在引用的对象,这就是产生内存泄漏的原因。 - 说说线程的生命周期和状态?
- 什么是线程上下文切换?
- 什么是线程死锁?
- 如何预防和避免死锁?
- sleep方法和wait方法对比.
- 为什么wait方法不定义在Thread中?
- 可以直接调用Thread类的run方法吗?
JMM模型
- 什么事JMM? 为什么需要JMM?
- JMM如何抽象线程和主存间的关系?
- happens-before的原则是什么?
happens-before 原则表达的意义其实并不是一个操作发生在另外一个操作的前面,虽然这从程序员的角度上来说也并无大碍。更准确地来说,它更想表达的意义是前一个操作的结果对于后一个操作是可见的,无论这两个操作是否在同一个线程里。 - 并发编程的三个特性是什么? 怎样理解?
原子性, 可见性, 有序性
volatile
关键字
- 如何保证变量的可见性?
- 如何禁止指令重排序?
volatile
可以保证原子性吗?volatile
关键字能保证数据的可见性, 但不能保证数据的原子性.synchronized
关键字两者都能保证.
乐观锁和悲观锁
- 什么是悲观锁?
共享资源每次只给一个线程使用, 其它线程阻塞, 用完后再把资源转让给其它线程.
像 Java 中synchronized和ReentrantLock等独占锁就是悲观锁思想的实现. - 什么是乐观锁?
线程可以不停地执行,无需加锁也无需等待,只是在提交修改的时候去验证对应的资源(也就是数据)是否被其它线程修改了(具体方法可以使用版本号机制或 CAS 算法)
在 Java 中java.util.concurrent.atomic包下面的原子变量类(比如AtomicInteger、LongAdder)就是使用了乐观锁的一种实现方式 CAS 实现的。 - 如何实现乐观锁?
版本号机制和CAS算法. - 乐观锁存在哪些问题?
ABA问题, 循环时间长开销大(自旋), 只能保证一个共享变量的原子操作.
Synchronized
关键字
synchronized
是什么? 有什么用?- 如何使用
Syncronized
? synchronized
和volatile
有什么区别?
IO
IO流
- 什么是IO流?
IO 流在 Java 中分为输入流和输出流,而根据数据的处理方式又分为字节流和字符流。