460道Java后端面试高频题答案版【模块三:Java并发】

2022-12-16 17:46:29 浏览数 (1)

写在前面

Java 并发是 Java 后端开发面试中最重要的模块之一,毕竟这是对 Java 基础的深度考核。而且现在基本上程序都是需要使用多线程进行处理的,如果说 Java 并发你不会,只要面试官问你了,可以说很难通过面试。所以这一块一定要好好下功夫。我个人学习这块知识点的学习方法和 Java集合类是非常像的,重点都在于考察你对源码的了解,学习Java 并发其实就是学习 JUC 包中的一些关键的类:AQS、原子类等等。

1、阅读源码:需要阅读 JUC 包中主要的类的源码:AQS、锁:ReentrantLock、ReentrantReadWriteLock、BlockingQueue、CountDownLatch、CyclicBarrier、线程池等等;

2、做笔记:因为看完源码很快就会忘了,所以需要对关键的源码部分加以注释做成笔记,这里推荐写博客或者写在 github 仓库中,方便后面面试时复习;

3、看大佬们的源码分析文章:因为你看的可是 JDK 的源码,其中很多设计精妙之处不是“我等菜鸡”随便就可以看出来的,所以多看看大佬们的文章,肯定会有意外的收获;

4、看面经:这个也是少不了的,了解面试官们问问题的方式和频率,可以有优先级的准备。

5、特别提醒:对于 Java 并发的面试题来说是一个很好展现自己基础的模块。所以如果你对这个模块掌握的比较好,面试遇到并发的问题千万不要面试官问什么,你就只回答什么,一定要扩展深度和广度,把你知道的都说出来。曾经有一次面美团,面试官一直问我分布式的知识,我问他现在对应届生的分布式都开始要求了吗?他回答,面试者太多了,要看到你和“面经”面试者的不一样。所以一定要在可以突显自己知识的模块多扩展,当然这是在你有把握的前提下,不然只会被吊打,适得其反。

1、并行和并发有什么区别?

1. 并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生;

2. 并行是在不同实体上的多个事件,并发是在同一实体上的多个事件;

3. 在一台处理器上“同时”处理多个任务,在多台处理器上同时处理多个任务。如 Hadoop 分布式集群。所以并发编程的目标是充分的利用处理器的每一个核,以达到最高的处理性能。

2、线程和进程的区别?

进程:是程序运行和资源分配的基本单位,一个程序至少有一个进程,一个进程至少有一个线程。进程在执行过程中拥有独立的内存单元,而多个线程共享内存资源,减少切换次数,从而效率更高。

线程:是进程的一个实体,是 cpu 调度和分派的基本单位,是比程序更小的能独立运行的基本单位。同一进程中的多个线程之间可以并发执行。

3、守护线程是什么?

守护线程(即 Daemon thread),是个服务线程,准确地来说就是服务其他的线程。

4、创建线程的几种方式?

1. 继承 Thread 类创建线程;

2. 实现 Runnable 接口创建线程;

3. 通过 Callable 和 Future 创建线程;

4. 通过线程池创建线程。

5、Runnable 和 Callable 有什么区别?

1. Runnable 接口中的 run() 方法的返回值是 void,它做的事情只是纯粹地去执行 run() 方法中的代码而已;

2. Callable 接口中的 call() 方法是有返回值的,是一个泛型,和 Future、FutureTask 配合可以用来获取异步执行的结果。

6、线程状态及转换?

hread 的源码中定义了6种状态:new(新建)、runnnable(可运行)、blocked(阻塞)、waiting(等待)、time waiting (定时等待)和 terminated(终止)。

线程状态转换如下图所示:

7、sleep() 和 wait() 的区别?

1. sleep() 方法正在执行的线程主动让出 cpu(然后 cpu 就可以去执行其他任务),在 sleep 指定时间后 cpu 再回到该线程继续往下执行(注意:sleep 方法只让出了 cpu,而并不会释放同步资源锁);而 wait()  方法则是指当前线程让自己暂时退让出同步资源锁,以便其他正在等待该资源的线程得到该资源进而运行,只有调用了 notify() 方法,之前调用 wait() 的线程才会解除 wait 状态,可以去参与竞争同步资源锁,进而得到执行。(注意:notify 的作用相当于叫醒睡着的人,而并不会给他分配任务,就是说 notify 只是让之前调用 wait 的线程有权利重新参与线程的调度);

2. sleep() 方法可以在任何地方使用,而 wait() 方法则只能在同步方法或同步块中使用;

3. sleep() 是线程类(Thread)的方法,调用会暂停此线程指定的时间,但监控依然保持,不会释放对象锁,到时间自动恢复;wait() 是 Object 的方法,调用会放弃对象锁,进入等待队列,待调用 notify()/notifyAll() 唤醒指定的线程或者所有线程,才会进入锁池,不再次获得对象锁才会进入运行状态。

0 人点赞