Java并发考什么+高频面试题
由于内容较多,我分类出来汇总了,全部面试题汇总的看这里:八股文题库(必看)
说实话,如果并发往深考,并发可以非常非常非常难,应该是所有八股文中,最难的一个点了,并发细节真的很烧脑!!!
如果你觉得学有余力,那么你可以看咱们这个专栏 Java并发编程课程 + 《Java并发编程艺术》,咱们的高频题里,就不涉及太多那种很难的知识了。
咱们的高频题给出 多线程基础 + 并发基础,一般来说,Java并发不会问的很深和很细,更多的是会结合你项目安全相关的来问你,而且我说个实话,面试官很多也都忘了,所以更多的是会问你大致原理,比如线程池有啥用,线程数是越多越好吗?等等。
所以我觉得,Java并发大家先优先掌握 CAS + AQS + synchronized + volatile + 悲观锁/乐观锁 + 线程池 + 死锁案例 这些就差不多了,如果你学有余力,再去看我上面说的专栏和书籍了,咱们这里,就让大家掌握最基础的。
下面我详细说一说考点 + 给一些资料吧。
PS:这里建议把 Java并发编程课程 前 11 节看完,都是并发基础
多线程基础(优先掌握)
多线程基础这部分是比较简单的,咱们主要需要掌握诸如 start 和 run 方法区别,Thread 和 Runnable 区别,sleep 和 wait 区别等等,对于这部分,你一定要自己去用一用哈,因为这些不怎么难,回答的时候也是简单回答就行,自己用过可以理解的更加深刻。
有时候你并发不懂没事,因为确实难,但是连最简单的多线程都不懂,可能是致命的
线程的start和run方法的区别:run 就是个普普通通的方法而已,而 start 这个方法才会调用相关的 函数去创建一个子线程
并发基础(优先掌握)
synchronized + volatile关键字指南:大家应该在代码中很早就接触 synchronized + volatile 了,大家可以先通过文章之类的,看下大致原理,之后再看看他们是怎么加锁的,大家其实可以写个最简单的 Java 程序,然后看一下他们的字节码,这是最好理解的,到时候面试官问起来,你说自己看过字节码,跟他解释,那就是大大加分。
IDEA 看字节码很简单,不需要反编译啥的,我给你们找来对应文章了:使用intellij idea 查看Java字节码
下面是关于这两个关键字的相关资料(给了文章 + 视频,在看视频,视频在最下面一起给了,你们可以先看下文章,看看能不能看懂)。
悲观锁/乐观锁:这些比较简单了,Java有很多锁,看我这篇就够了:一句话撸完重量级锁、自旋锁、轻量级锁、偏向锁、悲观、乐观锁等各种锁
volatile:一文搞懂volatile关键字,另外这个关键字不是 Java 特有的哦。
synchronized:注意它锁的是对象,看这篇文章:一文读懂synchronized
CAS:所有的并发的底层,都是基于 CAS,大家先掌握 CAS,看我之前写的文章:CAS 是什么?Java8是如何优化 CAS 的?
死锁:这个也简单了,就是有时候面试官会让你用代码写个死锁案例,大家记得自己写一下哈(记得写),这个我就不给出资料了,大家搞个类似的案例哈。
线程池:线程池我需要强调一个问题,就是麻烦大家想清楚下面这两个问题(因为基本必问,但是很多并没有答好,我希望大家 好好想一下):
1、线程池中的线程是越多越好吗?
2、为什么线程池可以加快速度?
入门看这篇了:图解 | 你管这破玩意叫线程池?
AQS:这是一个难点,大部分并发包都是基于 AQS,而 AQS 基于 CAS,关于 AQS 其实有点难的,需要多看几篇文章了,我给大家找了很硬核的文章(不过AQS得多折腾几次才能搞懂的了):从ReentrantLock的实现看AQS的原理及应用
几个重要的同步类:主要是这几个了,可以了解一下
- ReentrantLock
- CountDownLatch
- CycliBarrier
- Semaphore
我这里写了一篇极简入门的,当时看了源码之后总结了一波:Java并发包中最重要的几个同步类
下面是几个视频(和上面的多线程基础是一套的),但是我觉得并发这块,视频可能反而不容易懂,毕竟有的绕
最后,大家加油勒,有时间就多看几个不同的讲解版本吧,有些东西,只有多看几次,才能理解且掌握勒