面试 Java 并发编程八股文十问十答第十二期

面试 Java 并发编程八股文十问十答第十二期

作者:程序员小白条,个人博客

相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新!

⭐点赞⭐收藏⭐不迷路!⭐

1)并发类库提供的线程池实现有哪些?它们之间有什么区别?

Java 并发类库提供了几种线程池的实现,它们之间的区别主要体现在以下几个方面:

  1. ThreadPoolExecutor:ThreadPoolExecutor 是 Java 提供的最基本的线程池实现,可以通过构造函数自定义核心线程数、最大线程数、任务队列、拒绝策略等参数,灵活性较高,适用于各种场景。
  2. FixedThreadPool:FixedThreadPool 是一个固定大小的线程池,核心线程数和最大线程数相等,任务队列使用的是无界队列,适用于任务量固定的场景。
  3. CachedThreadPool:CachedThreadPool 是一个可缓存的线程池,核心线程数为 0,最大线程数为 Integer.MAX_VALUE,适用于执行大量的短期异步任务的场景,线程池会根据需要自动创建新线程,空闲线程会在一定时间内被回收。
  4. SingleThreadExecutor:SingleThreadExecutor 是一个单线程的线程池,核心线程数和最大线程数都为 1,任务队列使用的是无界队列,适用于需要保证任务按顺序执行的场景。
  5. ScheduledThreadPoolExecutor:ScheduledThreadPoolExecutor 是一个支持定时任务的线程池,可以延迟执行任务或者周期性执行任务,底层实现是基于 ThreadPoolExecutor 和 DelayQueue 实现的。

2)DelayQueue 和 ScheduledThreadPool 有什么区别呢?

  • DelayQueue:DelayQueue 是 Java 并发包中提供的一个带有延迟时间的无界阻塞队列。它存储实现了 Delayed 接口的元素,这些元素按照其指定的延迟时间被消费者从队列中取出。DelayQueue 通常用于定时任务调度、缓存过期等场景,例如实现定时任务执行和任务重试机制。
  • ScheduledThreadPool:ScheduledThreadPool 是 ScheduledExecutorService 接口的一个实现,它是一个支持定时任务调度的线程池。ScheduledThreadPool 可以用来执行延迟任务或者周期性任务,可以通过 schedule 方法或者 scheduleAtFixedRate、scheduleWithFixedDelay 方法来执行任务。

主要区别在于:

  • 功能不同:DelayQueue 是一个延迟队列,用于存储延迟元素,按照延迟时间进行消费;而 ScheduledThreadPool 是一个支持定时任务调度的线程池,可以执行延迟任务或者周期性任务。
  • 使用场景不同:DelayQueue 适用于需要按照延迟时间进行消费的场景,例如实现定时任务调度或者缓存过期;而 ScheduledThreadPool 适用于需要执行延迟任务或者周期性任务的场景,例如定时任务执行和任务重试机制。

3)Timer 有用过吗?

是的,Timer 是 Java 中用于执行定时任务的工具类。它允许程序在指定时间之后执行某个任务,也可以周期性地执行任务。但是,Timer 在实际使用中存在一些问题,比如:

  • 线程安全性:Timer 是单线程的,所有的任务都是由同一个线程来执行的,如果某个任务执行时间过长,会影响其他任务的执行。
  • 异常处理:如果 TimerTask 抛出了未捕获的异常,会导致 Timer 线程终止,这会影响到所有的任务。
  • 灵活性:Timer 对于任务的调度和取消不够灵活,如果需要动态调整任务的执行时间或者取消某个任务,比较麻烦。

因此,Java 并发包中的 ScheduledThreadPoolExecutor 通常被认为是更好的替代方案,它是一个支持定时任务调度的线程池,可以解决 Timer 存在的一些问题,并提供了更好的灵活性和性能。

4)时间轮有了解过吗?

时间轮(Time Wheel)是一种用于处理定时任务调度的数据结构,它将时间分成若干个时间槽,并使用一个环形数组来存储任务。时间轮通常包含一个指针,指向当前时间槽,当时间流逝时,指针不断移动,并执行当前时间槽中的任务。时间轮的主要优点是其简单高效的实现方式和低延迟的任务调度能力。

在实际应用中,时间轮常用于实现高性能的定时任务调度器,例如 Netty 中的 HashedWheelTimer,它使用时间轮来实现定时任务的调度,能够以非常高效的方式处理大量的定时任务。

5)你都用过哪些 Java 并发工具类?

我熟悉并经常使用的 Java 并发工具类包括但不限于:

  1. ThreadPoolExecutor:用于管理线程池,执行异步任务。
  2. ConcurrentHashMap:线程安全的哈希表实现,适用于多线程环境下的并发访问。
  3. ConcurrentLinkedQueue:线程安全的队列实现,适用于多线程环境下的并发操作。
  4. CountDownLatch:用于实现线程等待,可以让某个线程等待其他线程的结束。
  5. CyclicBarrier:用于实现多线程的同步,可以让一组线程相互等待,直到所有线程都达到某个同步点。
  6. Semaphore:用于实现资源的控制和同步,可以控制同时访问某个资源的线程数量。

除此之外,还有一些并发工具类和原子类(如 AtomicInteger、AtomicLong)等也经常被我使用。

6)Semaphore 用过吗?

是的,Semaphore 是 Java 并发包中提供的一个计数信号量,用于控制对资源的访问权限。Semaphore 维护了一个计数器,表示可用的许可证数量,线程可以通过 acquire 方法获取许可证,通过 release 方法释放许可证。

Semaphore 主要用于控制同时访问某个资源的线程数量,可以用来实现资源的互斥访问或者并发访问控制。常见的应用场景包括数据库连接池、线程池的并发控制、限流等。

例如,一个有界的线程池可以使用 Semaphore 来控制同时执行的任务数量,通过 acquire 方法获取许可证来执行任务,执行完任务后通过 release 方法释放许可证,从而控制线程池的并发度。

7)CyclicBarrier 用过吗?

是的,我用过 CyclicBarrier。它是 Java 并发包中的一个同步辅助类,用于实现多个线程之间的同步,让一组线程都到达一个同步点后再一起继续执行。与 CountDownLatch 不同的是,CyclicBarrier 可以重用,当所有线程都到达同步点后,它会自动重置,可以被多次使用。

8)CountDownLatch 用过吗?

是的,我也用过 CountDownLatch。它也是 Java 并发包中的一个同步辅助类,用于实现一个或多个线程等待其他线程完成某些操作后再继续执行。CountDownLatch 通过一个计数器来实现,计数器初始化为一个正整数,每个线程调用 countDown 方法会使计数器减一,调用 await 方法的线程会阻塞,直到计数器变为零。

9)StampedLock 用过吗?

StampedLock 是 Java 并发包中引入的一种乐观读取锁,它提供了一种乐观的读锁和悲观的写锁机制,用于控制对共享资源的访问。StampedLock 支持可重入的读锁和写锁,并且支持读锁升级为写锁,但不支持写锁降级为读锁。

我熟悉 StampedLock 的概念和使用方式,但目前还没有在实际项目中用过。它通常用于需要高并发读、低并发写的场景,可以提供更好的性能和并发控制。

10)CompletableFuture 有用过吗?

是的,我经常使用 CompletableFuture。它是 Java 8 中引入的一个异步编程工具,用于简化异步编程任务的处理。CompletableFuture 提供了丰富的方法和组合操作,可以方便地进行异步任务的串联、组合和转换,并支持异常处理、超时控制等功能。

通过 CompletableFuture,可以更加灵活地编写异步代码,实现非阻塞的并发操作,提高系统的并发性能和响应速度。我常用 CompletableFuture 来处理异步任务、执行并行操作、实现回调机制等。

开源项目地址:https://gitee.com/falle22222n-leaves/vue_-book-manage-system

前后端总计已经 800+ Star,1.5W+ 访问!

⭐点赞⭐收藏⭐不迷路!⭐

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/607104.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++】零钱兑换的始端---柠檬水找零

欢迎来CILMY23的博客 本篇主题为 零钱兑换的始端---柠檬水找零 个人主页:CILMY23-CSDN博客 个人专栏系列: Python | C | C语言 | 数据结构与算法 感谢观看,支持的可以给个一键三连,点赞关注收藏。 前言: 柠檬水找…

2024年最新【SpringBoot2】开发实用篇-测试_springboot2 test(1),2024年最新2024春招BAT面试真题详解

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化! 由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、…

吸血鬼崛起v rising皮革获取教程 v rising皮革机怎么获得

《V Rising》是一款由Stunlock Studios公司制作并发行的生存建造类游戏,以“吸血鬼”为题材。中文名为“吸血鬼崛起”。在游戏中,打boss可以获得许多掉落材料,有些材料需要合成,而制作皮革则需要使用皮革机。下面就为大家介绍一下…

利用大语言模型(KIMI)生成OPC UA 信息模型

在大语言模型没有出现之前,人们更倾向使用图形化工具或者基于窗口的软件来构建信息模型,图形化工具能够直观地表达信息模型中各元素之间的相互关系。但是图形化工具也有缺点,当描述一个复杂的信息模型时,图形会变得非常复杂和庞大…

如何通过OMS加快大表迁移至OceanBase

OMS,是OceanBase官方推出的数据迁移工具,能够满足众多数据迁移场景的需求,现已成为众多用户进行数据迁移同步的重要工具。OMS不仅支持多种数据源,还具备全量迁移、增量同步、数据校验等功能,并能够对分表进行聚合操作&…

豪投巨资,澳大利亚在追逐海市蜃楼吗?

澳大利亚政府正在积极投资于量子计算领域。继2021年向量子技术投资逾1亿澳元后,2023年5月,该国发布了首个国家量子战略,详细阐述了如何把握量子技术的未来及保持全球领先地位。 澳大利亚的国家量子战略概述 原文链接: https://ww…

jQuery-1.语法、选择器、节点操作

jQuery jQueryJavaScriptQuery&#xff0c;是一个JavaScript函数库&#xff0c;为编写JavaScript提供了更高效便捷的接口。 jQuery安装 去官网下载jQuery&#xff0c;1.x版本练习就够用 jQuery引用 <script src"lib/jquery-1.11.2.min.js"></script>…

力扣HOT100 - 4. 寻找两个正序数组的中位数

解题思路&#xff1a; 两个数组合并&#xff0c;然后根据奇偶返回中位数。 class Solution {public double findMedianSortedArrays(int[] nums1, int[] nums2) {int m nums1.length;int n nums2.length;int[] nums new int[m n];if (m 0) {if (n % 2 0) return (nums2…

游戏专用设备指纹方案解析

如同人类拥有独一无二的指纹&#xff0c;设备也有设备的指纹&#xff0c;我们可以把设备指纹理解为设备的唯一识别码。 构建设备指纹需要采集设备硬件信息、软件信息、环境信息、网络信息等维度信息&#xff0c;进行加密/压缩&#xff0c;再通过算法处理&#xff0c;赋予设备唯…

手机视频提取gif怎么操作?分享这个方法不能错过!

随着网络的发展动态gif表情包已经是人们交流的重要部分了。想要通过手机来实现视频转换gif的操作&#xff0c;还不想下载软件的情况下。可以通过使用手机端的视频转gif工具-GIF中文网&#xff0c;无需下载软件。手机端轻松一键就能在线实现视频提取gif的操作。一起来看看具体的…

【ETAS CP AUTOSAR工具链】RTA-OS基本概念与开发流程

RTA-OS基于早期ETAS操作系统的成熟技术&#xff0c;迄今为止&#xff0c;已在全球超过3.5亿个ECU中使用。RTA-OS是一个可静态配置的抢占式实时操作系统(RTOS)&#xff0c;它常被用于资源受限但有着高性能要求的方案中。内核的实现不仅遵循了AUTOSAR R3.x、R4.0、R4.1、R4.2、R4…

【stomp 实战】spring websocket 接收消息源码分析

后台消息的发送过程&#xff0c;我们通过spring websocket用户消息发送源码分析已经了解了。我们再来分析一下后端接收消息的过程。这个过程和后端发送消息过程有点类似。 前端发送消息 前端发送消息给服务端的示例如下&#xff1a; 发送给目的/app/echo一个消息。 //主动发…

英码科技推出昇腾系列AI加速卡:专为视频解析与模型推理场景打造,更具成本竞争力!

当前&#xff0c;人工智能的发展已进入加速渗透千行百业的阶段&#xff0c;算力已然成为数字化转型关键的新质生产力。随着国际挑战的加剧&#xff0c;国产算力的发展趋势愈发明显&#xff0c;市场需求也呈现出激增的态势。在这一大背景下&#xff0c;华为昇腾以其强大的技术实…

GaussianBody:基于3D高斯散射的服装人体重建

GaussianBody: Clothed Human Reconstruction via 3d Gaussian Splatting GaussianBody&#xff1a;基于3D高斯散射的服装人体重建 Mengtian Li1,2,3, Shengxiang Yao1, Zhifeng Xie1,3,2, Keyu Chen4,2, Yu-Gang Jiang2 李梦田 1,2,3 、姚胜祥 1 、谢志峰 1,3, 2 、陈科宇 4, …

谷歌开源!用 js 编写 Shell 脚本! | 开源日报 No.247

google/zx Stars: 41.4k License: Apache-2.0 zx 是一个用于编写更好脚本的工具。 提供有用的包装器&#xff0c;简化了对 child_process 的操作转义参数并提供合理的默认值使用 JavaScript 编写复杂脚本时比 Bash 更方便可以直接使用 npm 安装 dani-garcia/vaultwarden St…

长难句打卡5.9

For example, the Long Now Foundation has as its flagship project a mechanical clock that is designed to still be marking time thousands of years hence. 例如,今日永存资金会将机械钟表视为旗舰项目,因此该钟表旨在为未来几千年保持计时。 Foundation n.基金会flag…

数据库(MySQL)—— 索引

数据库&#xff08;MySQL&#xff09;—— 索引 什么是索引创建索引使用 CREATE INDEX 语句使用 ALTER TABLE 语句在创建表时定义索引特殊类型索引注意事项 举个例子无索引的情况有索引的情况为什么索引快索引的结构 今天我们来看看MySQL中的索引&#xff1a; 什么是索引 MyS…

unity基础(一)

内容概要&#xff1a; 生命周期函数vector3 位置 方向 缩放旋转等信息Vector3欧拉角和Quaternion四元素unity脚本执行顺序设置 一 生命周期函数 方法说明Awake最早调用,所以一般可以再此实现单例模式OnEnable组件激活后调用,在Awake后会调用一次Start在Update之前调用一次&a…

硬件知识积累 音频插座的了解,看音频插座的原理图来了解音频插座的引脚。

1. 音频接口 音频插座是一种用于连接音频信号线路的电子元件&#xff0c;常见于音频设备&#xff08;如音响、耳机、话筒等&#xff09;中。它的主要作用是将电子信号转化为声音信号&#xff0c;以满足人们对于音乐、电影、游戏等方面的需求。 根据插头形状的不同&#xff0c;音…

和comate一起,用JavaScript实现一个简易版五子棋小游戏

前言 五子棋起源于中国&#xff0c;是全国智力运动会竞技项目之一&#xff0c;是一种两人对弈的纯策略型棋类游戏。双方分别使用黑白两色的棋子&#xff0c;下在棋盘直线与横线的交叉点上&#xff0c;先形成五子连珠者获胜。 这次和Baidu Comate智能代码助手共同完成这个小游戏…
最新文章