Java并发编程面试题(2021最新版)

前言

多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一。在这里,从面试的角度列出了大部分重要的问题,可是你仍然应该牢固的掌握Java多线程基础知识来对应往后碰到的问题,小编这里还整理了一份并发编程的思惟导图,方便你们知识的总览。java

Java并发编程面试题(2021最新版)

小编分享的这份金三银四Java后端开发面试总结包含了JavaOOP、Java集合容器、Java异常、并发编程、Java反射、Java序列化、JVM、Redis、Spring MVC、MyBatis、MySQL数据库、消息中间件MQ、Dubbo、Linux、ZooKeeper、 分布式&数据结构与算法等26个专题技术点,都是小编在各个大厂总结出来的面试真题,已经有不少粉丝靠这份PDF拿下众多大厂的offer,今天在这里总结分享给到你们!【持续更新中!】程序员

完整版Java面试题地址:2021最新面试题合集集锦面试

序号 专题 内容 连接
1 中间件 Java中间件面试题(2021最新版) https://blog.51cto.com/14994509/2692669
2 微服务 Java微服务面试题(2021最新版) http://www.javashuo.com/article/p-haiifnkb-vk.html
3 并发编程 Java并发编程面试题(2021最新版) 持续更新中!
4 Java基础 Java基础知识面试题(2021最新版) 持续更新中!
5 Spring Boot Spring Boot面试题(2021最新版) 持续更新中!
6 Redis Redis面试题(2021最新版) 持续更新中!
7 Spring MVC Spring MVC面试题(2021最新版) 持续更新中!
8 Spring Cloud Spring Cloud面试题(2021最新版) 持续更新中!
9 MySQL优化 MySQL优化面试题(2021最新版) 持续更新中!
10 JVM JVM性能调优面试题(2021最新版) 持续更新中!
11 Linux Linux面试题(2021最新版) 持续更新中!
12 Mybatis Mybatis面试题(2021最新版) 持续更新中!
13 网络编程 TCP,UDP,Socket,Http网络编程面试题(2021最新版) 持续更新中!
14 设计模式 设计模式面试题(2021最新版) 持续更新中!
15 大数据 大数据面试题100道(2021最新版) 持续更新中!
16 Tomcat Tomcat面试题(2021最新版) 持续更新中!
17 多线程 多线程面试题(2021最新版) 持续更新中!
18 Nginx Nginx_BIO_NIO_AIO面试题(2021最新版) 持续更新中!
19 memcache memcache面试题(2021最新版) 持续更新中!
20 java异常 java异常面试题(2021最新版) 持续更新中!
21 Java虚拟机 Java虚拟机面试题(2021最新版) 持续更新中!
22 Java集合 Java集合面试题(2021最新版) 持续更新中!
23 Git经常使用命令 Git经常使用命令(2021最新版) 持续更新中!
24 Elasticsearch Elasticsearch面试题(2021最新版) 持续更新中!
25 Dubbo Dubbo面试题(2021最新版) 持续更新中!

1、基础知识

1. 为何要使用并发编程

  • 充分利用多核CPU的计算能力:经过并发编程的形式能够将多核CPU的计算能力发挥到极致,性能获得提高
  • 方便进行业务拆分,提高系统并发能力和性能:在特殊的业务场景下,先天的就适合于并发编程。如今的系统动不动就要求百万级甚至千万级的并发量,而多线程并发编程正是开发高并发系统的基础,利用好多线程机制能够大大提升系统总体的并发能力以及性能。面对复杂业务模型,并行程序会比串行程序更适应业务需求,而并发编程更能吻合这种业务拆分 。

2. 多线程应用场景

3. 并发编程有什么缺点

并发编程的目的就是为了能提升程序的执行效率,提升程序运行速度,可是并发编程并不老是能提升程序运行速度的,并且并发编程可能会遇到不少问题,好比**:内存泄漏、上下文切换、线程安全、死锁**等问题。算法

4. 并发编程三个必要因素是什么?

并发编程三要素(线程的安全性问题体如今):数据库

原子性:原子,即一个不可再被分割的颗粒。原子性指的是一个或多个操做要么所有执行成功要么所有执行失败。编程

可见性:一个线程对共享变量的修改,另外一个线程可以马上看到。(synchronized,volatile)后端

有序性:程序执行的顺序按照代码的前后顺序执行。(处理器可能会对指令进行重排序)设计模式

出现线程安全问题的缘由:数组

  • 线程切换带来的原子性问题
  • 缓存致使的可见性问题
  • 编译优化带来的有序性问题

解决办法:缓存

  • JDK Atomic开头的原子类、synchronized、LOCK,能够解决原子性问题
  • synchronized、volatile、LOCK,能够解决可见性问题
  • Happens-Before 规则能够解决有序性问题

5. Java 程序中怎么保证多线程的运行安全?

6. 并行和并发有什么区别?

7. 什么是多线程

多线程:多线程是指程序中包含多个执行流,即在一个程序中能够同时运行多个不一样的线程来执行不一样的任务。

8. 多线程的好处

能够提升 CPU 的利用率。在多线程程序中,一个线程必须等待的时候,CPU 能够运行其它的线程而不是等待,这样就大大提升了程序的效率。也就是说容许单个程序建立多个并行执行的线程来完成各自的任务。

9. 多线程的劣势:

  • 线程也是程序,因此线程须要占用内存,线程越多占用内存也越多;
  • 多线程须要协调和管理,因此须要 CPU 时间跟踪线程;
  • 线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题。

10. 线程和进程区别

进程

一个在内存中运行的应用程序。每一个进程都有本身独立的一块内存空间,一个进程能够有多个线程,好比在Windows系统中,一个运行的xx.exe就是一个进程。

线程

进程中的一个执行任务(控制单元),负责当前进程中程序的执行。一个进程至少有一个线程,一个进程能够运行多个线程,多个线程可共享数据。

线程具备许多传统进程所具备的特征,故又称为轻型进程(Light—Weight Process)或进程元;而把传统的进程称为重型进程(Heavy—Weight Process),它至关于只有一个线程的任务。在引入了线程的操做系统中,一般一个进程都有若干个线程,至少包含一个线程。

根本区别:进程是操做系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位

资源开销:每一个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程能够看作轻量级的进程,同一类线程共享代码和数据空间,每一个线程都有本身独立的运行栈和程序计数器(PC),线程之间切换的开销小。

包含关系:若是一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,因此线程也被称为轻权进程或者轻量级进程。

内存分配:同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的

影响关系:一个进程崩溃后,在保护模式下不会对其余进程产生影响,可是一个线程崩溃整个进程都死掉。因此多进程要比多线程健壮。

执行过程:每一个独立的进程有程序运行的入口、顺序执行序列和程序出口。可是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,二者都可并发执行

11. 什么是上下文切换?

多线程编程中通常线程的个数都大于 CPU 核心的个数,而一个 CPU 核心在任意时刻只能被一个线程使用,为了让这些线程都能获得有效执行,CPU 采起的策略是为每一个线程分配时间片并轮转的形式。当一个线程的时间片用完的时候就会从新处于就绪状态让给其余线程使用,这个过程就属于一次上下文切换。

归纳来讲就是:当前任务在执行完 CPU 时间片切换到另外一个任务以前会先保存本身的状态,以便下次再切换回这个任务时,能够再加载这个任务的状态。任务从保存到再加载的过程就是一次上下文切换

上下文切换一般是计算密集型的。也就是说,它须要至关可观的处理器时间,在每秒几十上百次的切换中,每次切换都须要纳秒量级的时间。因此,上下文切换对系统来讲意味着消耗大量的 CPU 时间,事实上,多是操做系统中时间消耗最大的操做。

Linux 相比与其余操做系统(包括其余类 Unix 系统)有不少的优势,其中有一项就是,其上下文切换和模式切换的时间消耗很是少。

12. 守护线程和用户线程有什么区别呢?

守护线程和用户线程

  • 用户 (User) 线程:运行在前台,执行具体的任务,如程序的主线程、链接网络的子线程等都是用户线程
  • 守护 (Daemon) 线程:运行在后台,为其余前台线程服务。也能够说守护线程是 JVM 中非守护线程的 “佣人”。一旦全部用户线程都结束运行,守护线程会随 JVM 一块儿结束工做

main 函数所在的线程就是一个用户线程啊,main 函数启动的同时在 JVM 内部同时还启动了好多守护线程,好比垃圾回收线程。

比较明显的区别之一是用户线程结束,JVM 退出,无论这个时候有没有守护线程运行。而守护线程不会影响 JVM 的退出。

注意事项:

  1. setDaemon(true)必须在start()方法前执行,不然会抛出 IllegalThreadStateException 异常
  2. 在守护线程中产生的新线程也是守护线程
  3. 不是全部的任务均可以分配给守护线程来执行,好比读写操做或者计算逻辑
  4. 守护 (Daemon) 线程中不能依靠 finally 块的内容来确保执行关闭或清理资源的逻辑。由于咱们上面也说过了一旦全部用户线程都结束运行,守护线程会随 JVM 一块儿结束工做,因此守护 (Daemon) 线程中的 finally 语句块可能没法被执行。

13. 如何在 Windows 和 Linux 上查找哪一个线程cpu利用率最高?

Java并发编程面试题(2021最新版)

14. 什么是线程死锁

Java并发编程面试题(2021最新版)

15. 造成死锁的四个必要条件是什么

  • 互斥条件:在一段时间内某资源只由一个进程占用。若是此时还有其它进程请求资源,就只能等待,直至占有资源的进程用毕释放。
  • 占有且等待条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对本身已得到的其它资源保持不放。
  • 不可抢占条件:别人已经占有了某项资源,你不能由于本身也须要该资源,就去把别人的资源抢过来。
  • 循环等待条件:若干进程之间造成一种头尾相接的循环等待资源关系。(好比一个进程集合,A在等B,B在等C,C在等A)

16. 如何避免线程死锁

  1. 避免一个线程同时得到多个锁
  2. 避免一个线程在锁内同时占用多个资源,尽可能保证每一个锁只占用一个资源
  3. 尝试使用定时锁,使用lock.tryLock(timeout)来替代使用内部锁机制

17. 建立线程的四种方式

  • 继承 Thread 类;
public class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " run()方法正在执
行...");
    }
  • 实现 Runnable 接口;
public class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " run()方法执行
中...");
    }
  • 实现 Callable 接口;
public class MyCallable implements Callable<Integer> {
    @Override
    public Integer call() {
        System.out.println(Thread.currentThread().getName() + " call()方法执行
中...");
        return 1;
    }
  • 使用匿名内部类方式
public class CreateRunnable {
    public static void main(String[] args) {
        //建立多线程建立开始
        Thread thread = new Thread(new Runnable() {
            public void run() {
                for (int i = 0; i < 10; i++) {
                    System.out.println("i:" + i);
                }
            }
        }
        );
        thread.start();
    }
}

18. 说一下 runnable 和 callable 有什么区别

Java并发编程面试题(2021最新版)

19. 线程的 run()和 start()有什么区别?

  • 每一个线程都是经过某个特定Thread对象所对应的方法run()来完成其操做的,run()方法称为线程体。经过调用Thread类的start()方法来启动一个线程。
  • start() 方法用于启动线程,run() 方法用于执行线程的运行时代码。run() 能够重复调用,而 start()只能调用一次。
  • start()方法来启动一个线程,真正实现了多线程运行。调用start()方法无需等待run方法体代码执行完毕,能够直接继续执行其余的代码; 此时线程是处于就绪状态,并无运行。 而后经过此Thread类调用方法run()来完成其运行状态, run()方法运行结束, 此线程终止。而后CPU再调度其它线程。
  • run()方法是在本线程里的,只是线程里的一个函数,而不是多线程的。 若是直接调用run(),其实就至关因而调用了一个普通函数而已,直接待用run()方法必须等待run()方法执行完毕才能执行下面的代码,因此执行路径仍是只有一条,根本就没有线程的特征,因此在多线程执行时要使用 start()方法而不是run()方法。

20. 为何咱们调用 start() 方法时会执行 run() 方法,为何咱们不能直接调用 run() 方法?

Java并发编程面试题(2021最新版)

21. 什么是 Callable 和 Future?

  • Callable 接口相似于 Runnable,从名字就能够看出来了,可是 Runnable 不会返回结果,而且没法抛出返回结果的异常,而 Callable 功能更强大一些,被线程执行后,能够返回值,这个返回值能够被 Future 拿到,也就是说,Future 能够拿到异步执行任务的返回值。
  • Future 接口表示异步任务,是一个可能尚未完成的异步任务的结果。因此说 Callable用于产生结果,Future 用于获取结果。

22. 什么是 FutureTask

  • FutureTask 表示一个异步运算的任务。FutureTask 里面能够传入一个 Callable 的具体实现类,能够对这个异步运算的任务的结果进行等待获取、判断是否已经完成、取消任务等操做。只有当运算完成的时候结果才能取回,若是运算还没有完成 get 方法将会阻塞。一个 FutureTask 对象能够对调用了 Callable 和 Runnable 的对象进行包装,因为 FutureTask 也是Runnable 接口的实现类,因此 FutureTask 也能够放入线程池中。

23. 线程的状态

Java并发编程面试题(2021最新版)

24. Java 中用到的线程调度算法是什么?

Java并发编程面试题(2021最新版)

25. 线程的调度策略

Java并发编程面试题(2021最新版)

26. 什么是线程调度器(Thread Scheduler)和时间分片(Time Slicing )?

Java并发编程面试题(2021最新版)

27. 请说出与线程同步以及线程调度相关的方法。

28. sleep() 和 wait() 有什么区别?

Java并发编程面试题(2021最新版)

29. 你是如何调用 wait() 方法的?使用 if 块仍是循环?为何?

Java并发编程面试题(2021最新版)

30. 为何线程通讯的方法 wait(), notify()和 notifyAll()被定义在 Object 类里?

Java并发编程面试题(2021最新版)

31. 为何 wait(), notify()和 notifyAll()必须在同步方法或者同步块中被调用?

Java并发编程面试题(2021最新版)

32. Thread 类中的 yield 方法有什么做用?

Java并发编程面试题(2021最新版)

33. 为何 Thread 类的 sleep()和 yield ()方法是静态的?

Java并发编程面试题(2021最新版)

34. 线程的 sleep()方法和 yield()方法有什么区别?

Java并发编程面试题(2021最新版)

35. 如何中止一个正在运行的线程?

Java并发编程面试题(2021最新版)

36. Java 中 interrupted 和 isInterrupted 方法的区别?

Java并发编程面试题(2021最新版)

37. 什么是阻塞式方法?

Java并发编程面试题(2021最新版)

38. Java 中你怎样唤醒一个阻塞的线程?

Java并发编程面试题(2021最新版)

39. notify() 和 notifyAll() 有什么区别?

Java并发编程面试题(2021最新版)

40. 如何在两个线程间共享数据?

Java并发编程面试题(2021最新版)

41. Java 如何实现多线程之间的通信和协做?

Java并发编程面试题(2021最新版)

42. 同步方法和同步块,哪一个是更好的选择?

Java并发编程面试题(2021最新版)

43. 什么是线程同步和线程互斥,有哪几种实现方式?

Java并发编程面试题(2021最新版)

44. 在监视器(Monitor)内部,是如何作线程同步的?程序应该作哪一种级别的同步?

Java并发编程面试题(2021最新版)

45. 若是你提交任务时,线程池队列已满,这时会发生什么

Java并发编程面试题(2021最新版)

46. 什么叫线程安全?servlet 是线程安全吗?

Java并发编程面试题(2021最新版)

47. 在 Java 程序中怎么保证多线程的运行安全?

Java并发编程面试题(2021最新版)

48. 你对线程优先级的理解是什么?

Java并发编程面试题(2021最新版)

49. 线程类的构造方法、静态块是被哪一个线程调用的

Java并发编程面试题(2021最新版)

50. Java 中怎么获取一份线程 dump 文件?你如何在 Java 中获取线程堆栈?

  • Dump文件是进程的内存镜像。能够把程序的执行状态经过调试器保存到dump文件中。
  • 在 Linux 下,你能够经过命令 kill -3 PID (Java 进程的进程 ID)来获取 Java应用的 dump 文件。
  • 在 Windows 下,你能够按下 Ctrl + Break 来获取。这样 JVM 就会将线程的 dump 文件打印到标准输出或错误文件中,它可能打印在控制台或者日志文件中,具体位置依赖应用的配置。

51. 一个线程运行时发生异常会怎样?

  • 若是异常没有被捕获该线程将会中止执行。Thread.UncaughtExceptionHandler是用于处理未捕获异常形成线程忽然中断状况的一个内嵌接口。当一个未捕获异常将形成线程中断的时候,JVM会使用 Thread.getUncaughtExceptionHandler()来查询线程的 UncaughtExceptionHandler 并将线程和异常做为参数传递给 handler 的 uncaughtException()方法进行处理。

52. Java 线程数过多会形成什么异常?

Java并发编程面试题(2021最新版)

53. 多线程的经常使用方法

Java并发编程面试题(2021最新版)

2、并发理论

1. Java中垃圾回收有什么目的?何时进行垃圾回收?

  • 垃圾回收是在内存中存在没有引用的对象或超过做用域的对象时进行的。
  • 垃圾回收的目的是识别而且丢弃应用再也不使用的对象来释放和重用资源。

2. 线程之间如何通讯及线程之间如何同步

  • 在并发编程中,咱们须要处理两个关键问题:线程之间如何通讯及线程之间如何同步。通讯是指线程之间以如何来交换信息。通常线程之间的通讯机制有两种:共享内存和消息传递。
  • Java的并发采用的是共享内存模型,Java线程之间的通讯老是隐式进行,整个通讯过程对程序员彻底透明。若是编写多线程程序的Java程序员不理解隐式进行的线程之间通讯的工做机制,极可能会遇到各类奇怪的内存可见性问题。

3. Java内存模型

  • 共享内存模型指的就是Java内存模型(简称JMM),JMM决定一个线程对共享变量的写入时,能对另外一个线程可见。从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(main memory)中,每一个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程以读/写共享变量的副本。本地内存是JMM的一个抽象概念,并不真实存在。它涵盖了缓存,写缓冲区,寄存器以及其余的硬件和编译器优化。

Java并发编程面试题(2021最新版)

Java并发编程面试题(2021最新版)

4. 若是对象的引用被置为null,垃圾收集器是否会当即释放对象占用的内存?

  • 不会,在下一个垃圾回调周期中,这个对象将是被可回收的。
  • 也就是说并不会当即被垃圾收集器马上回收,而是在下一次垃圾回收时才会释放其占用的内存。

5. finalize()方法何时被调用?析构函数(finalization)的目的是什么?

Java并发编程面试题(2021最新版)

6. 什么是重排序

Java并发编程面试题(2021最新版)

7. 重排序实际执行的指令步骤

Java并发编程面试题(2021最新版)

8. 重排序遵照的规则

Java并发编程面试题(2021最新版)

9. as-if-serial规则和happens-before规则的区别

Java并发编程面试题(2021最新版)

10. 并发关键字 synchronized ?

Java并发编程面试题(2021最新版)

11. 说说本身是怎么使用 synchronized 关键字,在项目中用到了吗

Java并发编程面试题(2021最新版)

12. 单例模式了解吗?给我解释一下双重检验锁方式实现单例模式!”

Java并发编程面试题(2021最新版)

13. 说一下 synchronized 底层实现原理?

Java并发编程面试题(2021最新版)

14. synchronized可重入的原理

Java并发编程面试题(2021最新版)

15. 什么是自旋

Java并发编程面试题(2021最新版)

16. 多线程中 synchronized 锁升级的原理是什么?

Java并发编程面试题(2021最新版)

17. 线程 B 怎么知道线程 A 修改了变量

  • (1)volatile 修饰变量
  • (2)synchronized 修饰修改变量的方法
  • (3)wait/notify
  • (4)while 轮询

18. 当一个线程进入一个对象的 synchronized 方法 A 以后,其它线程是否可进入此对象的synchronized 方法 B?

Java并发编程面试题(2021最新版)

19. synchronized、volatile、CAS 比较

  • (1)synchronized 是悲观锁,属于抢占式,会引发其余线程阻塞。
  • (2)volatile 提供多线程共享变量可见性和禁止指令重排序优化。
  • (3)CAS 是基于冲突检测的乐观锁(非阻塞)

20. synchronized 和 Lock 有什么区别?

  • 首先synchronized是Java内置关键字,在JVM层面,Lock是个Java类;
  • synchronized 能够给类、方法、代码块加锁;而 lock 只能给代码块加锁。
  • synchronized 不须要手动获取锁和释放锁,使用简单,发生异常会自动释放锁,不会形成死锁; 而 lock 须要本身加锁和释放锁,若是使用不当没有 unLock()去释放锁就会形成死锁。
  • 经过 Lock 能够知道有没有成功获取锁,而 synchronized 却没法办到。

21. synchronized 和 ReentrantLock 区别是什么?

Java并发编程面试题(2021最新版)

22. volatile 关键字的做用

Java并发编程面试题(2021最新版)

23. Java 中能建立 volatile 数组吗?

Java并发编程面试题(2021最新版)

24. volatile 变量和 atomic 变量有什么不一样?

Java并发编程面试题(2021最新版)

25. volatile 能使得一个非原子操做变成原子操做吗?

Java并发编程面试题(2021最新版)

26. synchronized 和 volatile 的区别是什么?

Java并发编程面试题(2021最新版)

27. final不可变对象,它对写并发应用有什么帮助?

Java并发编程面试题(2021最新版)

28. Lock 接口和synchronized 对比同步它有什么优点?

Java并发编程面试题(2021最新版)

29. 乐观锁和悲观锁的理解及如何实现,有哪些实现方式?

Java并发编程面试题(2021最新版)

30. 什么是 CAS

Java并发编程面试题(2021最新版)

31. CAS 的会产生什么问题?

Java并发编程面试题(2021最新版)

32. 什么是原子类

Java并发编程面试题(2021最新版)

33. 原子类的经常使用类

  • AtomicBoolean
  • AtomicInteger
  • AtomicLong
  • AtomicReference

34. 说一下 Atomic的原理?

Atomic包中的类基本的特性就是在多线程环境下,当有多个线程同时对单个(包括基本类型及引用类型)变量进行操做时,具备排他性,即当多个线程同时对该变量的值进行更新时,仅有一个线程能成功,而未成功的线程能够向自旋锁同样,继续尝试,一直等到执行成功。

35. 死锁与活锁的区别,死锁与饥饿的区别?

Java并发编程面试题(2021最新版)

3、线程池

1. 什么是线程池?

Java并发编程面试题(2021最新版)

2. 线程池做用?

Java并发编程面试题(2021最新版)

3. 线程池有什么优势?

Java并发编程面试题(2021最新版)

4. 什么是ThreadPoolExecutor?

Java并发编程面试题(2021最新版)

5. 什么是Executors?

Java并发编程面试题(2021最新版)

Java并发编程面试题(2021最新版)

6. 线程池四种建立方式?

Java并发编程面试题(2021最新版)

7. 在 Java 中 Executor 和 Executors 的区别?

Java并发编程面试题(2021最新版)

8. 四种构建线程池的区别及特色?

Java并发编程面试题(2021最新版)

Java并发编程面试题(2021最新版)

Java并发编程面试题(2021最新版)

Java并发编程面试题(2021最新版)

9. 线程池都有哪些状态?

Java并发编程面试题(2021最新版)

10. 线程池中 submit() 和 execute() 方法有什么区别?

Java并发编程面试题(2021最新版)

11. 什么是线程组,为何在 Java 中不推荐使用?

Java并发编程面试题(2021最新版)

12. ThreadPoolExecutor饱和策略有哪些?

Java并发编程面试题(2021最新版)

13. 如何自定义线程线程池?

Java并发编程面试题(2021最新版)

Java并发编程面试题(2021最新版)

14. 线程池的执行原理?

Java并发编程面试题(2021最新版)

15. 如何合理分配线程池大小?

Java并发编程面试题(2021最新版)

4、并发容器

1. 你常用什么并发容器,为何?

  • 答:Vector、ConcurrentHashMap、HasTable
  • 通常软件开发中容器用的最多的就是HashMap、ArrayList,LinkedList ,等等
  • 可是在多线程开发中就不能乱用容器,若是使用了未加锁(非同步)的的集合,你的数据就会很是的混乱。由此在多线程开发中须要使用的容器必须是加锁(同步)的容器。

2. 什么是Vector

Java并发编程面试题(2021最新版)

3. ArrayList和Vector有什么不一样之处?

Java并发编程面试题(2021最新版)

4. 为何HashTable是线程安全的?

Java并发编程面试题(2021最新版)

Java并发编程面试题(2021最新版)

5. 用过ConcurrentHashMap,讲一下他和HashTable的不一样之处?

Java并发编程面试题(2021最新版)

6. Collections.synchronized * 是什么?

Java并发编程面试题(2021最新版)

7. Java 中 ConcurrentHashMap 的并发度是什么?

Java并发编程面试题(2021最新版)

8. 什么是并发容器的实现?

Java并发编程面试题(2021最新版)

9. Java 中的同步集合与并发集合有什么区别?

Java并发编程面试题(2021最新版)

10. SynchronizedMap 和 ConcurrentHashMap 有什么区别?

Java并发编程面试题(2021最新版)

11. CopyOnWriteArrayList 是什么?

Java并发编程面试题(2021最新版)

12. CopyOnWriteArrayList 的使用场景?

合适读多写少的场景。

13. CopyOnWriteArrayList 的缺点?

Java并发编程面试题(2021最新版)

14. CopyOnWriteArrayList 的设计思想?

Java并发编程面试题(2021最新版)

5、并发队列

1. 什么是并发队列:

  • 消息队列不少人知道:消息队列是分布式系统中重要的组件,是系统与系统直接的通讯
  • 并发队列是什么:并发队列多个线程以有次序共享数据的重要组件

2. 并发队列和并发集合的区别:

  • 队列遵循“先进先出”的规则,能够想象成排队检票,队列通常用来解决大数据量采集处理和显示 的。
  • 并发集合就是在多个线程中共享数据的

3. 怎么判断并发队列是阻塞队列仍是非阻塞队列

在并发队列上JDK提供了Queue接口,一个是以Queue接口下的BlockingQueue接口为表明的阻塞 队列,另外一个是高性能(无堵塞)队列。

4. 阻塞队列和非阻塞队列区别

  • 当队列阻塞队列为空的时,从队列中获取元素的操做将会被阻塞。
  • 或者当阻塞队列是满时,往队列里添加元素的操做会被阻塞。
  • 或者试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其余的线程往空的队列插入新的元素。
  • 试图往已满的阻塞队列中添加新元素的线程一样也会被阻塞,直到其余的线程使队列从新变得空闲起来

5. 经常使用并发列队的介绍:

并发队列的经常使用方法

Java并发编程面试题(2021最新版)

6、并发工具类

1. 经常使用的并发工具类有哪些?

Java并发编程面试题(2021最新版)

面试题答案解析完整文档:【Java并发编程面试题【附答案解析】

最后

小编分享的文章到这里就结束了,整理不易,欢迎你们一块儿交流,喜欢小编分享的文章记得关注我点赞哟,感谢支持!