专栏首页JAVA技术zhai聊聊面试中关于并发问题的应对方案

聊聊面试中关于并发问题的应对方案

主题

又到面试季了,从群里,看到许多同学分享了自己的面试题目,我也抽空在网上搜索了一些许多公司使用的面试题,目前校招和社招的面试题基本都集中在几个大方向上,主要是:Java基础、并发、JVM、算法、数据库、一些框架、分布式集群 等。这里呢,单独就面试中的【并发】问题的准备和学习发表一下个人的见解。

现状

关于对并发的学习和理解,通过大家在课程群里的反馈,总结一下,主要包含以下几种:

完全不知道并发的存在

知道并发要学,但是不知道该学习什么

知道并发重要,自己买相关书籍学,但是看完了还是懵懵懂懂

知道并发重要,自己查资料学了一些,许多都学会了,但总能发现不会的,不知道并发到底都要学什么

已经完成进阶,并发的问题了然于胸,这样的小伙伴目前很少

首先说一下,为什么Java面试要考并发,而且并发相关的题目占比又是那么的高。对并发有一定了解的同学,应该都知道,大家平时 只要做Java项目就会涉及到并发 ,个别同学说自己从没接触过并发,这只是个人还没意识到而已。当你定义好一个可以调用的接口时,这时其实就已经和并发有关系了,因为任何一个接口都可能同时被请求多次。当你在项目中已经可以熟练的使用synchronized、volatile、static、final这些基本的Java关键字时,其实你对并发已经有一些基础了。大家总说的:面试造火箭、入职拧螺丝,其实有一部分原因也是因为你还没意识到面试考的这些东西其实一直就伴随着你的日常开发。

我不自量力的去列一下并发涉及到的关键字、类及可以考察的知识点:CPU缓存、Java内存模型JMM、atomic、AtomicInteger、AtomicLong、LongAdder、AtomicReference、AtomicBoolean、CAS原理、Unsafe、synchronized、volatile、final、static、ThreadLocal、AQS、J.U.C、CountDownLatch、Semaphore、CyclicBarrier、ReentrantLock、ReentrantReadWriteLock、StampLock、Condition、FutureTask、Fork/Join、BlockingQueue、ThreadPoolExecutor、ExecutorService、Thread、Runnable、Future、Callable、HashMap、 HashTable、ConcurrentHashMap、CopyOnWriteArrayList、CopyOnWriteArraySet、RateLimiter、SimpleDateFormat、StringBuffer、StringBuilder、ArrayList、Vector、HashSet、ConcurrentSkipListSet、Collections.synchronizedXXX、Guava Cache、Redis ... 我尝试去写出脑海里与并发有关的类和名词,我发现根本写!不!完!是的,并发的知识太多了,以致于很难给出一个完整的囊括。

因此呢,如果你盲目的一个知识点一个知识的去学,你就会发现你怎么都学不完,也很难在脑海里形成一个完整的知识体系,带来的最直接结果就是,你每次去面试时都要去把并发相关的再过一下,生怕自己被问到还没接触的。这时候,你要做的就是,先要在脑海里有一个完整的并发知识体系,然后根据这个体系去不断完善这个体系里每个模块的细节。想要详细了解并发编程知识体系的可以加群:650385180,以下的高清脑图已经放在群里面。

并发

关于并发的学习,可以从JDK提供的并发包为核心开始,许多其他的类和封装都是对其进行扩展或者补充,我们来看一下Java并发包(java.util.concurrent包,简称J.U.C)的构成:

J.U.C核心由5大块组成:atomic包、locks包、collections包、tools包(AQS)、executor包(线程池)。大家平时遇到许多并发相关的类都可以从这里找到。但是呢,要想系统的掌握并发,不能是打开J.U.C这个包,挨个类去看,这里只是提供了五大块,代表核心的五个方向。要想系统的学习并发,可以加群650385180,并且还需要从并发的角度学习,过程中覆盖J.U.C的这些知识。这里我直接给出并发的学习步骤图(包含对当前面试常见考点的覆盖,比如对HashMap和ConcurrentHashMap的源码分析):

这个之前呢,还需要对Java并发的基础进行细致的学习,比如CPU缓存和Java内存模型(JMM),许多关键字比如volatile、synchronized等的特性都是在JMM里规定好的。

高并发

我们这篇手记题目里提到的并发其实包含两部分:并发和高并发。手记讲到现在,其实我们讲的都是两部分里的第一部分:并发。那么并发和高并发到底有什么区别呢?许多小伙伴对这两个概念都是模糊的,我简单做一下区分。

当我们说多线程并发时,其实我们更多的是讨论多个线程操作了相同的资源,这时我们讨论点更多的是落在保证线程安全以及合理分配和使用资源上。而高并发主要指系统运行过程中遇到“短时间内遇到大量操作请求”的情况,主要发生在系统集中收到大量请求(例如:12306的抢票情况;天猫双十一活动)。当我们说高并发时,我们谈的是是如何提高现有程序的性能,更多的是对高并发场景的一些解决方案,思路啦、手段等等。如果高并发处理不好,不仅仅降低了用户的体验度(请求响应时间过长),同时可能导致系统宕机,严重的甚至导致OOM异常,系统停止工作等。这里呢,我直接给出高并发场景通常都会考虑的一些解决思路和手段:

结尾

如何有效的准备面试中并发类问题,我已经给出我的理解。希望这些能帮大家在脑海里建立起大致的并发知识体系,然后根据这个知识体系有针对性的的去准备面试。预祝大家能高分通过面试,拿到高薪!

当然,光提概念光看图是没用的,还需要大家根据这些提纲去实际学习相关的知识点和类才行。我已经准备好了这些实际知识点学习的流程,相信聪明的你已经知道该怎么办了~

主题

又到面试季了,从群里,看到许多同学分享了自己的面试题目,我也抽空在网上搜索了一些许多公司使用的面试题,目前校招和社招的面试题基本都集中在几个大方向上,主要是:Java基础、并发、JVM、算法、数据库、一些框架、分布式集群 等。这里呢,单独就面试中的【并发】问题的准备和学习发表一下个人的见解。

现状

关于对并发的学习和理解,通过大家在课程群里的反馈,总结一下,主要包含以下几种:

完全不知道并发的存在

知道并发要学,但是不知道该学习什么

知道并发重要,自己买相关书籍学,但是看完了还是懵懵懂懂

知道并发重要,自己查资料学了一些,许多都学会了,但总能发现不会的,不知道并发到底都要学什么

已经完成进阶,并发的问题了然于胸,这样的小伙伴目前很少

首先说一下,为什么Java面试要考并发,而且并发相关的题目占比又是那么的高。对并发有一定了解的同学,应该都知道,大家平时 只要做Java项目就会涉及到并发 ,个别同学说自己从没接触过并发,这只是个人还没意识到而已。当你定义好一个可以调用的接口时,这时其实就已经和并发有关系了,因为任何一个接口都可能同时被请求多次。当你在项目中已经可以熟练的使用synchronized、volatile、static、final这些基本的Java关键字时,其实你对并发已经有一些基础了。大家总说的:面试造火箭、入职拧螺丝,其实有一部分原因也是因为你还没意识到面试考的这些东西其实一直就伴随着你的日常开发。

我不自量力的去列一下并发涉及到的关键字、类及可以考察的知识点:CPU缓存、Java内存模型JMM、atomic、AtomicInteger、AtomicLong、LongAdder、AtomicReference、AtomicBoolean、CAS原理、Unsafe、synchronized、volatile、final、static、ThreadLocal、AQS、J.U.C、CountDownLatch、Semaphore、CyclicBarrier、ReentrantLock、ReentrantReadWriteLock、StampLock、Condition、FutureTask、Fork/Join、BlockingQueue、ThreadPoolExecutor、ExecutorService、Thread、Runnable、Future、Callable、HashMap、 HashTable、ConcurrentHashMap、CopyOnWriteArrayList、CopyOnWriteArraySet、RateLimiter、SimpleDateFormat、StringBuffer、StringBuilder、ArrayList、Vector、HashSet、ConcurrentSkipListSet、Collections.synchronizedXXX、Guava Cache、Redis ... 我尝试去写出脑海里与并发有关的类和名词,我发现根本写!不!完!是的,并发的知识太多了,以致于很难给出一个完整的囊括。

因此呢,如果你盲目的一个知识点一个知识的去学,你就会发现你怎么都学不完,也很难在脑海里形成一个完整的知识体系,带来的最直接结果就是,你每次去面试时都要去把并发相关的再过一下,生怕自己被问到还没接触的。这时候,你要做的就是,先要在脑海里有一个完整的并发知识体系,然后根据这个体系去不断完善这个体系里每个模块的细节。想要详细了解并发编程知识体系的可以加群:650385180,以下的高清脑图已经放在群里面。

并发

关于并发的学习,可以从JDK提供的并发包为核心开始,许多其他的类和封装都是对其进行扩展或者补充,我们来看一下Java并发包(java.util.concurrent包,简称J.U.C)的构成:

J.U.C核心由5大块组成:atomic包、locks包、collections包、tools包(AQS)、executor包(线程池)。大家平时遇到许多并发相关的类都可以从这里找到。但是呢,要想系统的掌握并发,不能是打开J.U.C这个包,挨个类去看,这里只是提供了五大块,代表核心的五个方向。要想系统的学习并发,可以加群650385180,并且还需要从并发的角度学习,过程中覆盖J.U.C的这些知识。这里我直接给出并发的学习步骤图(包含对当前面试常见考点的覆盖,比如对HashMap和ConcurrentHashMap的源码分析):

这个之前呢,还需要对Java并发的基础进行细致的学习,比如CPU缓存和Java内存模型(JMM),许多关键字比如volatile、synchronized等的特性都是在JMM里规定好的。

高并发

我们这篇手记题目里提到的并发其实包含两部分:并发和高并发。手记讲到现在,其实我们讲的都是两部分里的第一部分:并发。那么并发和高并发到底有什么区别呢?许多小伙伴对这两个概念都是模糊的,我简单做一下区分。

当我们说多线程并发时,其实我们更多的是讨论多个线程操作了相同的资源,这时我们讨论点更多的是落在保证线程安全以及合理分配和使用资源上。而高并发主要指系统运行过程中遇到“短时间内遇到大量操作请求”的情况,主要发生在系统集中收到大量请求(例如:12306的抢票情况;天猫双十一活动)。当我们说高并发时,我们谈的是是如何提高现有程序的性能,更多的是对高并发场景的一些解决方案,思路啦、手段等等。如果高并发处理不好,不仅仅降低了用户的体验度(请求响应时间过长),同时可能导致系统宕机,严重的甚至导致OOM异常,系统停止工作等。这里呢,我直接给出高并发场景通常都会考虑的一些解决思路和手段:

结尾

如何有效的准备面试中并发类问题,我已经给出我的理解。希望这些能帮大家在脑海里建立起大致的并发知识体系,然后根据这个知识体系有针对性的的去准备面试。预祝大家能高分通过面试,拿到高薪!

当然,光提概念光看图是没用的,还需要大家根据这些提纲去实际学习相关的知识点和类才行。我已经准备好了这些实际知识点学习的流程,相信聪明的你已经知道该怎么办了~

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 干货:Java高并发解决思路大起底

    对于我们开发的网站,如果网站的访问量非常大的话,那么我们就需要考虑相关的并发访问问题了。而并发问题是绝大部分的程序员头疼的问题,但话又说回来了,既然逃避不掉,那...

    技术zhai
  • MySQL 如何创建索引?怎么优化?

    索引类似大学图书馆建书目索引,可以提高数据检索的效率,降低数据库的IO成本。MySQL在300万条记录左右性能开始逐渐下降,虽然官方文档说500~800w记录,...

    技术zhai
  • 2018“金三”之一线互联网公司Java高级面试题总结

    3、知道字节码吗?字节码都有哪些?Integer x =5,int y =5,比较x =y 都经过哪些步骤?

    技术zhai
  • 突破Java面试(45)-高并发系统的架构设计

    所以如果你确实有真才实学,在互联网公司里干过高并发系统,那你确实拿offer基本如探囊取物,没啥问题。

    JavaEdge
  • Python 高级并发

    就是直接用『原子操作』(atomic operation)所实现的并发。这种并发是给程序库的编写者用的, 而应用程序开发者则不需要它,因为这种写法很容易出错,而...

    用户1416054
  • Flink1.4 并发执行

    本节介绍如何在Flink中配置程序的并行执行。一个Flink程序由多个任务(transformations/operators,data sources和sin...

    smartsi
  • 百度压测,分析性能拐点

    空闲之余用jmeter对百度进行了一次压测,目的是分析一下性能的拐点,验证一下理论知识

    飞天小子
  • 到底什么级别才算是高并发?

    https://segmentfault.com/a/1190000010844969

    Java技术栈
  • Web开发中说高并发的时候,我们在说什么

    大家先心里仔细想想,当你们听到高并发网站时,心里对这个网站是个什么概念?首先想到的是淘宝吗?带着问题,我们一起思考技术

    大愚
  • 学习PHP性能优化正式篇(一)

    首先我们要先了解到如何判断一个的性能上限是多少,这就为我们引入了压测工具的了解和使用,常用的压测工具当然就是Apache 开源基金会的 ab工具了。

    Hi胡瀚

扫码关注云+社区

领取腾讯云代金券