Apong's Blog

当你快坚持不住的时候,困难也快坚持不住了

0%

每日杂记 day7

并发常见面试题

什么是进程、线程

用户线程和内核线程

线程和进程的区别

Java 运行时数据区域(JDK1.8 之后)

程序计数器和栈信息为什么是私有的

线程的生命周期切换的流程是?

Java 线程状态变迁图

线程之间是如何切换的?

时间分片,上下文切换。

什么是上下文切换

sleep和wait的区别

  1. 目的
  2. 苏醒时间
  3. 挂载对象

为什么要使用多线程?

  1. 计算机底层:多核 CPU 时代意味着多个线程可以同时运行
  2. 应用环境趋势

Java 的线程调度方式

操作系统:

  1. 抢占式调度
  2. 协同式调度

单核CPU上多个线程效率一定会高吗

  1. CPU密集型
  2. IO密集型,利用响应时间

多线程会带来什么问题?

  1. 内存泄漏
  2. 死锁
  3. 线程不安全

什么是死锁?产生的必要条件?

必要条件

  1. 互斥条件
  2. 请求与保持
  3. 不剥夺
  4. 循环等待

如何破坏死锁?

破坏必要条件

如何避免死锁:银行家算法

双检锁单例为什么需要 volatile 关键字?

乐观锁和悲观锁,区别?

CAS规则,ABA问题

如何做到多个变量的原子性:引用类型CAS

多益网络笔试题

数据结构

哈希表,二叉树,链表

排序算法

希尔排序、堆排序、选择排序、插入排序。

算法题

  1. 一个 m*n 的矩阵,从左到右和从上到下都是递增的,判断某个数是否存在

普通思路:两层遍历,一一比对。

利用数据变化特性:

从左上角开始,可以利用递增的特性往前和往后,但是无法具体确定横向还是纵向移动。

而从右上角开始,就有唯一确定的移动方向:小于即左移,大于即下移。

  1. 螺旋遍历矩阵

应该是边界与边界的控制问题,但是没解决。