java常用框架面试题,

  java常用框架面试题,

  Yyds干货库存

  大家好,我是悟空。让我简单介绍一下我自己:

  我毕业于世界排名前9的慕尼黑工业大学(计算机科学排名)和专业排名第一的同济大学。我获得了全额留学奖学金。现在就职于一线明星互联网公司。

  面试久了,你会发现Java并发编程是面试的重点。而且随着公司的发展,用户数量会与日俱增,高性能、高并发的问题自然是无法避免的。所以,具备并发处理能力的Java程序员,一定是大部分公司渴望的烫手山芋。

  接下来和大家分享一下我对Java并发知识的看法。全文主要分为以下六点:

  Java并发工具的痛点有三类:线程安全、管理方便、相互协作。第一类:针对线程安全,第二类:针对线程管理,第三类:针对线程协作——控制并发进程的工具。面试中的常见问题。1.Java并发工具的痛点。在Java并发中,一个很重要的内容就是对各种工具类的理解。常见的广义并发工具有:线程池、ConcurrentHashMap、AtomicInteger、CopyOnWriteArrayList、ArrayBlockingQueue、synchronized、LongAdder、ThreadLocal、各种Lock、Future、CountDownLatch、Semaphore等等。

  每个人都或多或少的使用过这些工具,但是如果我们自己编写类似功能的工具类,很容易出错,因为我们可能考虑不周;JDK的常用工具类已经过成千上万人的测试,值得信赖,功能完善。

  我们应该学会如何使用并深刻理解这些工具类的原理。没必要的时候也没必要反复造轮子,因为我们其实很难写出一个功能良好,经得起考验的线程池。代码有几千行,实际上,要完全读懂并不容易。

  从刚才一长串工具名称可以看出,并发工具很多,功能好像也不一样,要完全掌握并不容易。

  所以在这里,我们对Java中常见的工具类进行梳理,并进行分类,以便啃下这块“硬骨头”。

  2.三类Java工具Java并发工具根据用途分为三类:

  第一类:针对线程安全第二类:针对线程管理第三类:针对线程协作3354控制并发进程的开发请点击下面的思维导图。

  有了这个分类,以后我们得到一个不熟悉的并发工具类时,就可以据此对号入座了。先树立整体观念,以后学起来就容易多了。

  我们来分别描述一下这三类。

  3.第一类:为了线程安全。第一类是最常见的工具类,最典型的有各种锁、原子类、ConcurrentHashMap等。这些工具的目的是帮助我们确保并发情况下的线程安全。

  就实现线程安全的工具类而言,有两个分类角度,第一个是从底层原理,第二个是从用户程序员的角度。两种分类只是视角不同,但本质是一样的,是一一对应的。

  这里,我们以线程安全中的老大哥“锁”为例来了解一下:

  1.锁的分类——各种类型的锁很多,乱花渐有吸引力。怎样才能拨开迷雾,看透本质?下面的分类是从不同的角度来看的,但是这些分类并不是互斥的,也就是多种类型可以并存:一把锁有可能同时属于两种类型。例如,ReentrantLock既是互斥的,又是可重入的。

  2.常见的锁有哪些?适用场景是什么?如您所见,我们通常将锁分为以下几类:

  悲观锁和乐观锁共享锁和排他锁公平锁和不公平锁可重入锁和不可重入锁可中断锁和不可中断锁以自旋锁和非自旋锁为例,分析类型和应用场景如下:

  4.类II:为了管理线程,除了刚才提到的为了线程安全的工具类,现在要介绍的“管理线程”也是一类重要的并发工具,最典型的就是线程池和未来的相关类。我们先来看看线程池。

  为了便于线程管理和提高效率,——线程池

  1线程池的重要性线程池是一个非常重要的工具。如果你想成为一名优秀的工程师,你需要很好地掌握这些知识。网上很多问题都是因为没有用好线程池造成的。

  即使你现阶段的目标没有那么远大,你也要知道,这基本上是面试中的必答题,面试官很容易从应聘者的回答中捕捉到应聘者的技术水平。

  2什么是“池”软件中的“池”?可以理解为工厂。工厂有一定数量的工人,工人会帮你做产品。但是每个工人的招聘和培训会花费很多,所以你想充分利用现有的,比如20个工人长期帮你做事,而不是每次都重新招聘。

  如果最近生意好,可以适当扩大招生,但是工厂能配置的资源有限,比如占地面积,资金等。所以当你真的接到太多订单的时候,你不可能无限扩大工人的招生,所以订单只能排队等着工人慢慢处理。

  总结成两点,“池子”的作用:

  重用现有资源,控制资源总量。数据库连接池如此,线程池也是如此。

  当一个新任务来了,我发现池中有空闲线程,我就直接派他去工作。不需要重新创建线程,因为创建和销毁线程都很麻烦。而如果新任务来了,如果池中所有线程都忙,现在池中有很多线程,那么新任务就去排队了~

  3为什么要使用线程池?一句话,可以减少开销,提高效率:

  1)问题1:重复创建线程代价很大。

  在Java中,如果每次请求到达时都创建一个新线程,开销是相当高的,因为每个Java线程对应一个操作系统线程。

  在实际使用中,创建和销毁线程需要时间。如果这是一个很轻的请求,并且服务器必须创建一个新的线程来处理它,那么创建和销毁线程可能比处理请求需要更长的时间。

  2)问题2:线程太多会占用太多内存

  创建太多线程也会导致内存溢出。活动线程需要消耗系统资源。如果在一个JVM中创建了太多的线程,系统可能会因为过度的内存消耗或“过度切换”而导致系统资源不足。

  3)解决上述两个问题的思路

  使用尽可能少的线程——,以避免过多的内存占用。

  让这些线程一直工作,可以重复执行task ——,避免生命周期的损失。

  4线程池的好处线程池解决了线程生命周期开销和系统资源不足的问题。第一次创建线程池时,会先创建一定数量的线程,比如说10个,这样当一个新的请求被分配时,可以直接从池中取出一个已经创建好的线程,直接开始处理请求,这样就节省了创建线程的时间。

  再加上线程的重复使用,可以大大降低线程生命周期的成本。而且由于请求到达时线程已经存在,消除了线程创建带来的延迟,应用的响应更快,增强了用户体验。

  合理使用内存和CPU通过灵活适当地调整一个线程中线程的数量,可以在线程过多导致的内存溢出(避免抛出java.lang.out内存错误:无法创建新的原生线程)和线程过少导致的CPU资源浪费之间达到完美的平衡。

  使用线程池的统一资源管理可以统一管理任务队列和线程,比如可以统一开始和结束,比单个线程逐个处理任务更方便,更容易管理。同时也方便数据统计,因为每个ThreadPoolExecutor还维护一些基本的统计,比如完成任务的数量。

  5线程池适用于服务器接收大量短线程请求的应用场合,使用线程池技术是非常合适的,可以大大减少线程的创建和销毁次数,提高服务器的工作效率。

  获取子线程——Future相关类的运行结果

  Future的核心思想是,一个方法的计算过程可能非常耗时,等待方法返回显然是不明智的。可以将计算过程放入线程池中执行,并通过未来控制方法的计算过程,计算结果后直接获得结果,避免了傻等带来的时间浪费。

  在JDK 8中,还引入了非常有用的CompletableFuture,可以完成“等待多个异步任务完成,得到结果,然后用这些结果执行下一个任务”等更复杂的功能。

  5.第三类:用于线程合作。除了上面提到的“为了线程安全”和“为了线程管理”,第三类并发工具类是为了线程之间的合作和互助。

  控制并发进程的工具类,帮助我们程序员让线程之间的协作更容易满足业务逻辑,比如让线程A等待线程B完成执行任务的协作策略。

  控制并发流程的工具简称为同步工具,主要包括以下几种:

  6.面试常见问题。关于Java并发工具类和原理,每个类都有很多知识点,会是面试中的常见问题。

  这里我们仅以ConcurrentHashMap为例,问题的难度会逐渐增加:

  比较Hashtable,HashMap,TreeMap,它们有什么区别?

  同样的线程安全,ConcurrentHashMap和Hashtable的区别?

  为什么有Collections.synchronizedMap(),而需要ConcurrentHashMap?

  Hashmap(同Hashset)在多线程下可能会造成100%的CPU。为什么?

  ,JDK8的ConcurrentHashMap也会造成100%的CPU,你知道吗?

  Java 7和8中的HashMap有什么区别?

  Java 7和8中的并发HashMap有什么区别?画出结构图。

  为什么8个以上的地图桶会变成红黑树?

  你知道并发Hashmap的扩展过程吗?画一个流程图。

  版权归作者所有:原创作品来自博主imooc海量开放网络课程君,转载请联系作者取得授权,否则将追究法律责任。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: