面试官:你连多线程问题你都清楚,还想要我怎么“放水”?

面试官:问你几个多线程相关的问题吧,说一下导致线程死锁的原因,怎么解除线程死锁?

 

程序员阿里:这个...死锁...

(一分钟后)

面试官:不知道?那好,说一下Lock 和 Synchronized 的区别?

程序员阿里:Lock是锁...

面试官:...会就会,不会就说不会,节省一下时间,sleep 和 wait 的区别总该知道吧?

程序员阿里:...不怎么了解

面试官:那多线程的几种实现方式,什么是线程安全,这总该知道吧?

程序员阿里:咱能换个技术点问吗?

面试官:连多线程并发你都一问三不知,还要我们怎么进行下去?

打开UC浏览器 查看更多精彩图片

在Java开发中,多线程一般是指实现多个任务共同执行的技术,是一个比较基础,也很常用的技术。

要理解多线程,需要先搞懂几个概念:

 

进程:每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。进程也可能是整个程序或者是部分程序的动态执行。

线程:线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。通常由操作系统负责多个线程的调度和执行。线程是程序中一个单一的顺序控制流程。

多线程:在单个程序中同时运行多个线程完成不同的工作,称为多线程。

并发:在操作系统中,并发是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。

多线程并发同样也是面试问题中很大概率会问到的技术点。

下面给大家整理了一套多线程并发相关的核心面试点,把所有多线程并发常见的面试题汇总到了一起。

这些知识点的导图和问题的答案详解的PDF文档都可以免费分享给大家,帮小编转发一下文章后,私信【多线程】免费领取!

 

Java多线程并发

1. JAVA 并发知识库

2. JAVA 线程实现/创建方式

1. 继承 Thread 类

2. 实现 Runnable 接口

3. ExecutorService、Callable<Class>、Future 有返回值线程

4. 基于线程池的方式

 

3. 4 种线程池

1. newCachedThreadPool

2. newFixedThreadPool

3. newScheduledThreadPool

4. newSingleThreadExecutor

 

4. 线程生命周期(状态)

1. 新建状态(NEW)

2. 就绪状态(RUNNABLE)

3. 运行状态(RUNNING)

4. 阻塞状态(BLOCKED)

  • 等待阻塞(o.wait->等待队列)

  • 同步阻塞(lock->锁池)

  • 其他阻塞(sleep/join)

5. 线程死亡(DEAD)

  • 正常结束

  • 异常结束

  • 调用 stop

5. 终止线程 4 种方式

1. 正常运行结束

2. 使用退出标志退出线程

3. Interrupt 方法结束线程

4. stop 方法终止线程(线程不安全)

6. sleep 与 wait 区别

7. start 与 run 区别

8. JAVA 后台线程

9. JAVA 锁

1. 乐观锁

2. 悲观锁

3. 自旋锁

  • 自旋锁的优缺点

  • 自旋锁时间阈值(1.6 引入了适应性自旋锁)

  • 自旋锁的开启

4. Synchronized 同步锁

  • Synchronized 作用范围

  • Synchronized 核心组件

  • Synchronized 实现

5. ReentrantLock

  • Lock 接口的主要方法

  • 非公平锁

  • 公平锁

  • ReentrantLock 与 synchronized

  • ReentrantLock 实现

  • Condition 类和 Object 类锁方法区别区别

  • tryLock 和 lock 和 lockInterruptibly 的区别

6. Semaphore 信号量

  • 实现互斥锁(计数器为 1)

  • 代码实现

  • Semaphore 与 ReentrantLock

7. AtomicInteger

8. 可重入锁(递归锁)

9. 公平锁与非公平锁

  • 公平锁(Fair)

  • 非公平锁(Nonfair)

10. ReadWriteLock 读写锁

  • 读锁

  • 写锁

11. 共享锁和独占锁

  • 独占锁

  • 共享锁

12. 重量级锁(Mutex Lock)

13. 轻量级锁

  • 锁升级

14. 偏向锁

15. 分段锁

16. 锁优化

  • 减少锁持有时间

  • 减小锁粒度

  • 锁分离

  • 锁粗化

  • 锁消除

10. 线程基本方法

1. 线程等待(wait)

2. 线程睡眠(sleep)

3. 线程让步(yield)

4. 线程中断(interrupt)

5. Join 等待其他线程终止

6. 为什么要用 join()方法?

7. 线程唤醒(notify)

8. 其他方法

11. 线程上下文切换

1. 进程

2. 上下文

3. 寄存器

4. 程序计数器

5. PCB-“切换桢”

6. 上下文切换的活动

7. 引起线程上下文切换的原因

12. 同步锁与死锁

1. 同步锁

2. 死锁

13. 线程池原理

1. 线程复用

2. 线程池的组成

3. 拒绝策略

4. Java 线程池工作过程

14. JAVA 阻塞队列原理

1. 阻塞队列的主要方法

  • 插入操作

  • 获取数据操作

2. Java 中的阻塞队列

3. ArrayBlockingQueue(公平、非公平)

4. LinkedBlockingQueue(两个独立锁提高并发)

5. PriorityBlockingQueue(compareTo 排序实现优先)

6. DelayQueue(缓存失效、定时任务)

7. SynchronousQueue(不存储数据、可用于传递数据)

8. LinkedTransferQueue

9. LinkedBlockingDeque

15. CyclicBarrier、CountDownLatch、Semaphore 的用法

1. CountDownLatch(线程计数器 )

2. CyclicBarrier(回环栅栏-等待至 barrier 状态再全部同时执行)

3. Semaphore(信号量-控制同时访问的线程个数)

16. volatile 关键字的作用(变量可见性、禁止重排序)

1. 变量可见性

2. 禁止重排序

3. 比 sychronized 更轻量级的同步锁

4. 适用场景

17. 如何在两个线程之间共享数据

1. 将数据抽象成一个类,并将数据的操作作为这个类的方法

2. Runnable 对象作为一个类的内部类

18. ThreadLocal 作用(线程本地存储)

1. ThreadLocalMap(线程的一个属性)

2. 使用场景

19. synchronized 和 ReentrantLock 的区别

1. 两者的共同点

2. 两者的不同点

20. ConcurrentHashMap 并发

1. 减小锁粒度

2. ConcurrentHashMap 分段锁

  • ConcurrentHashMap 是由 Segment 数组结构和 HashEntry 数组结构组成

21. Java 中用到的线程调度

1. 抢占式调度

2. 协同式调度

3. JVM 的线程调度实现(抢占式调度)

4. 线程让出 cpu 的情况

22. 进程调度算法

1. 优先调度算法

2. 高优先权优先调度算法

3. 基于时间片的轮转调度算法

23. 什么是 CAS(比较并交换-乐观锁机制-锁自旋)

1. 概念及特性

2. 原子包 java.util.concurrent.atomic(锁自旋)

3. ABA 问题

24. 什么是 AQS(抽象的队列同步器)

1. Exclusive 独占资源-ReentrantLock

2. Share 共享资源-Semaphore/CountDownLatch

3. 同步器的实现是 ABS 核心(state 资源状态计数)

4. ReentrantReadWriteLock 实现独占和共享两种方式

答案预览:

这些知识点的导图和问题的答案详解的PDF文档都可以免费分享给大家,帮小编转发一下文章后,私信【666】免费领取!

 

©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页