并发常见面试题
什么是进程、线程
用户线程和内核线程
线程和进程的区别
程序计数器和栈信息为什么是私有的
线程的生命周期切换的流程是?
线程之间是如何切换的?
时间分片,上下文切换。
什么是上下文切换
sleep和wait的区别
- 锁
- 目的
- 苏醒时间
- 挂载对象
为什么要使用多线程?
- 计算机底层:多核 CPU 时代意味着多个线程可以同时运行
- 应用环境趋势
Java 的线程调度方式
操作系统:
- 抢占式调度
- 协同式调度
单核CPU上多个线程效率一定会高吗
- CPU密集型
- IO密集型,利用响应时间
多线程会带来什么问题?
- 内存泄漏
- 死锁
- 线程不安全
什么是死锁?产生的必要条件?
必要条件
- 互斥条件
- 请求与保持
- 不剥夺
- 循环等待
如何破坏死锁?
破坏必要条件
如何避免死锁:银行家算法
双检锁单例为什么需要 volatile 关键字?
乐观锁和悲观锁,区别?
CAS规则,ABA问题
如何做到多个变量的原子性:引用类型CAS
多益网络笔试题
数据结构
哈希表,二叉树,链表
排序算法
希尔排序、堆排序、选择排序、插入排序。
算法题
- 一个 m*n 的矩阵,从左到右和从上到下都是递增的,判断某个数是否存在
普通思路:两层遍历,一一比对。
利用数据变化特性:
从左上角开始,可以利用递增的特性往前和往后,但是无法具体确定横向还是纵向移动。
而从右上角开始,就有唯一确定的移动方向:小于即左移,大于即下移。
- 螺旋遍历矩阵
应该是边界与边界的控制问题,但是没解决。