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

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

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

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

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

1)Executors和ThreaPoolExecutor创建线程池的区别

  • Executors是一个工厂类,提供了一些静态方法用于创建不同类型的线程池。它隐藏了ThreadPoolExecutor的一些细节,简化了线程池的创建过程。但是,它的一些默认配置可能不适合所有场景,因此使用时需要注意。
  • ThreadPoolExecutor是线程池的实现类,提供了更灵活的配置选项。可以通过构造函数来指定核心线程数、最大线程数、线程空闲时间、任务队列等参数,以及自定义拒绝策略。可以根据具体需求进行定制化配置。

2)你知道怎么创建线程池吗?

可以使用ThreadPoolExecutor类的构造函数来创建线程池,也可以使用Executors类提供的静态方法来创建线程池。以下是两种常见的创建线程池的方法:

  • 使用ThreadPoolExecutor构造函数:
ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit, BlockingQueue);

其中,corePoolSize表示核心线程数,maximumPoolSize表示最大线程数,keepAliveTime表示线程空闲时间,TimeUnit表示时间单位,BlockingQueue表示任务队列。

  • 使用Executors类的静态方法:
ExecutorService executor = Executors.newFixedThreadPool(nThreads);

其中,nThreads表示线程池中的线程数量。

3)ThreadPoolExecutor构造函数重要参数分析

  • corePoolSize:核心线程数,表示线程池中保持活动状态的线程数量,即使它们处于空闲状态也不会被回收。
  • maximumPoolSize:最大线程数,表示线程池中允许存在的最大线程数量。
  • keepAliveTime:线程空闲时间,表示当线程池中的线程数量超过核心线程数时,空闲线程在被回收之前等待新任务的时间。
  • TimeUnit:时间单位,用于指定keepAliveTime的单位,如秒、毫秒等。
  • BlockingQueue:任务队列,用于保存等待执行的任务。可以选择不同类型的队列,如ArrayBlockingQueue、LinkedBlockingQueue等,以满足不同的需求。
  • ThreadFactory:线程工厂,用于创建新的线程。可以自定义线程工厂来指定线程的名称、优先级等属性。
  • RejectedExecutionHandler:拒绝策略,用于处理无法接受的新任务。可以选择不同的拒绝策略,如AbortPolicy、CallerRunsPolicy等,或自定义拒绝策略来处理任务被拒绝的情况。

这些参数可以根据具体需求来进行配置,以创建适合的线程池。

4)一个简单的线程池Demo:Runnable+ThreadPoolExecutor 线程池实现原理

下面是一个简单的线程池Demo,使用Runnable接口和ThreadPoolExecutor类来实现线程池:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class ThreadPoolDemo {public static void main(String[] args) {// 创建一个固定大小为5的线程池ExecutorService executor = Executors.newFixedThreadPool(5);// 提交10个任务给线程池执行for (int i = 0; i < 10; i++) {Runnable task = new Task(i);executor.execute(task);}// 关闭线程池executor.shutdown();}static class Task implements Runnable {private int taskId;public Task(int taskId) {this.taskId = taskId;}@Overridepublic void run() {System.out.println("Task " + taskId + " is running.");}}
}

这个示例中,通过Executors类的newFixedThreadPool方法创建一个固定大小为5的线程池。然后,使用execute方法提交10个任务给线程池执行。每个任务都是一个实现了Runnable接口的Task类的实例。最后,调用shutdown方法关闭线程池。

线程池的实现原理是,线程池内部维护了一个线程队列和一个任务队列。当有任务提交时,线程池会从线程队列中取出一个空闲线程来执行任务。如果线程队列中没有空闲线程,且当前线程数小于最大线程数,则会创建新的线程。如果线程数已达到最大线程数,任务会被放入任务队列中等待执行。当线程执行完任务后,会继续从任务队列中取出下一个任务执行,直到任务队列为空。

通过使用线程池,可以更好地管理和控制线程的数量,避免线程创建和销毁的开销,提高系统的性能和资源利用率。

5)什么是原子操作?在 Java Concurrency API 中有哪些原子类 (atomic classes)?

原子操作是指不可被中断的操作,要么全部执行成功,要么全部不执行。在并发编程中,原子操作是保证多线程安全的重要手段。

Java Concurrency API中提供了一些原子类,用于支持原子操作。常见的原子类有:

  • AtomicInteger:提供原子操作的int类型变量。
  • AtomicLong:提供原子操作的long类型变量。
  • AtomicBoolean:提供原子操作的boolean类型变量。
  • AtomicReference:提供原子操作的引用类型变量。
  • AtomicStampedReference:提供带有版本号的原子引用操作。

这些原子类提供了一些常用的原子操作方法,如get、set、compareAndSet等,保证了对变量的操作是原子的,避免了多线程并发访问时的数据不一致和竞态条件问题。

6)说一下 atomic 的原理?

atomic的原理是通过使用底层的硬件指令或锁机制来保证操作的原子性。

在硬件层面,现代处理器提供了一些原子操作的指令,如compare-and-swap (CAS)。CAS指令可以在一个原子操作中读取和修改一个内存位置的值,如果内存位置的值与预期值相等,则将新值写入该位置,否则不进行任何操作。CAS操作是原子的,因为它在执行期间会锁定内存位置,防止其他线程修改该值。

在Java中,原子类使用了CAS操作来保证原子性。它们使用了volatile变量和Unsafe类来实现底层的CAS操作。volatile变量保证了变量的可见性,而Unsafe类提供了直接操作内存的方法。原子类通过使用CAS操作来保证对变量的操作是原子的,从而避免了多线程并发访问时的数据不一致和竞态条件问题。

总结起来,atomic的原理是通过底层的硬件指令或锁机制来保证操作的原子性,从而实现多线程并发访问时的数据一致性和线程安全性。

7)在 Java 中 CycliBarriar 和 CountdownLatch 有什么区别?

  • CountDownLatch是一种同步工具,它可以让一个或多个线程等待其他线程完成操作后再继续执行。它通过一个计数器来实现,计数器的初始值为线程的数量,每个线程完成操作后会将计数器减1,当计数器减到0时,等待的线程就会被唤醒继续执行。CountDownLatch只能使用一次,计数器的值无法重置。
  • CyclicBarrier也是一种同步工具,它可以让一组线程互相等待,直到所有线程都达到某个共同的屏障点后再继续执行。CyclicBarrier的计数器可以重复使用,当所有线程都到达屏障点后,计数器会重置为初始值,等待的线程会被唤醒继续执行。

总的来说,CountDownLatch用于等待其他线程完成操作,而CyclicBarrier用于等待一组线程互相达到屏障点。CountDownLatch的计数器只能使用一次,而CyclicBarrier的计数器可以重复使用。

8)Semaphore 有什么作用

Semaphore是一种计数信号量,用于控制同时访问某个资源的线程数量。Semaphore维护了一个计数器,线程可以通过acquire方法获取许可证,表示线程占用了一个资源,计数器会减1;线程可以通过release方法释放许可证,表示线程释放了一个资源,计数器会加1。当计数器为0时,acquire方法会阻塞线程,直到有其他线程释放许可证。

Semaphore的主要作用是限制同时访问某个资源的线程数量,可以用于控制并发线程的数量,避免资源的过度竞争。它可以用于实现一些常见的并发模式,如连接池、限流器等。

9)什么是线程间交换数据的工具Exchanger

Exchanger是一种线程间交换数据的工具,它提供了一个同步点,两个线程可以在这个同步点交换数据。当一个线程调用Exchanger的exchange方法时,它会被阻塞,直到另一个线程也调用了exchange方法,然后两个线程会交换数据并继续执行。

Exchanger可以用于解决生产者-消费者模式中的数据交换问题,它可以让生产者线程和消费者线程在同一个同步点上交换数据。通过Exchanger,生产者线程可以将数据传递给消费者线程,消费者线程可以将处理结果传递回生产者线程,从而实现线程间的数据交换。

10)常用的并发工具类有哪些?

在Java中,常用的并发工具类有:

  • CountDownLatch:用于等待其他线程完成操作后再继续执行。
  • CyclicBarrier:用于等待一组线程互相达到屏障点后再继续执行。
  • Semaphore:用于控制同时访问某个资源的线程数量。
  • Exchanger:用于线程间交换数据。
  • Lock和ReentrantLock:用于实现互斥锁。
  • Condition:用于实现线程间的等待和通知机制。
  • BlockingQueue:用于实现生产者-消费者模式的线程安全队列。
  • ConcurrentHashMap:用于实现线程安全的哈希表。
  • Atomic类:如AtomicInteger、AtomicLong等,提供原子操作的变量,用于实现线程安全的计数器、累加器等。

这些并发工具类提供了一些常见的并发操作的实现,可以帮助开发者更好地管理和控制多线程并发访问时的资源竞争和线程同步问题。

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java Web项目—餐饮管理系统Day09-用户端开发(二)

文章目录 1. 地址簿管理1-1. 新增地址1-2 查询当前用户的地址簿1-3. 更新默认地址1-4. 获取默认地址1-5. 修改地址 2. 订单管理2-1. 表结构2-2 提交订单 本章节主要完成地址簿的管理以及订单管理, 同时完善系统的部分细节, Reggie TakeAway 系统篇章基础篇告一段落. 1. 地址簿管…

重要JVM参数和监控指令、工具

一、重要JVM参数 堆内存相关 1.显式指定堆内存–Xms和-Xmx -Xms<heap size>[unit] -Xmx<heap size>[unit] //如果我们要为 JVM 分配最小 2 GB 和最大 5 GB 的堆内存大小 -Xms2G -Xmx5G2.显式新生代内存(Young Generation) -XX:NewSize<young size>[unit]…

SpringBoot异常:类文件具有错误的版本 61.0, 应为 52.0的解决办法

问题&#xff1a; java: 无法访问org.mybatis.spring.annotation.MapperScan 错误的类文件: /D:/Program Files/apache-maven-3.6.0/repository/org/mybatis/mybatis-spring/3.0.3/mybatis-spring-3.0.3.jar!/org/mybatis/spring/annotation/MapperScan.class 类文件具有错误的…

实体门店加盟全解析:如何选择加盟项目与避免风险

对于想要开实体店或创业的人来说&#xff0c;拥有一个全面的运营方案是成功的关键。作为一名开鲜奶吧5年的创业者&#xff0c;我将为大家详细分享从选址到日常管理的实体店运营要点&#xff0c;帮助创业者少走弯路。 一、选择加盟项目 1.行业前景&#xff1a;选择一个有发展前…

Flutter第五弹:Flutter布局

目标&#xff1a; 1&#xff09;Flutter常用的布局容器小组件有哪些&#xff1f; 2&#xff09;Flutter列表组件的小例子。 一、Flutter常用的容器组件 1.1 Container组件 Container 部件有许多可用的属性&#xff0c;以下是一些常用的属性&#xff1a; 属性说明alignmen…

【华为OD机试】小明找位置【C卷|100分】

【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述 小朋友出操,按学号从小到大排成一列;小明来迟了,请你给小明出个主意,让他尽快找到他应该排的位置。 算法复杂度要求不高于 nLog(n);学号为整数类型,队列规模<=10000; 输入描述 1…

java15~17 密封类

密封类是java15第一次预览&#xff0c;java17正式确定。Java15的密封类是一种确定了子类的类。这个改变是巨大的&#xff0c;以往的Java版本根本无法确定到底有哪些子类。而在java15中&#xff0c;如果定义了一个类为密封类就可以确定有哪些直接子类了。如下面的例子&#xff1…

Vue2(五):收集表单数据、过滤器、自定义指令、Vue的生命周期

一、收集表单数据 爱好&#xff1a;学习<input type"checkbox" value"study" v-model"hobby">打游戏<input type"checkbox" value"games" v-model"hobby">吃饭<input type"checkbox" v…

独立维基和验收测试框架 Fitnesse 入门介绍

拓展阅读 junit5 系列教程 基于 junit5 实现 junitperf 源码分析 Auto generate mock data for java test.(便于 Java 测试自动生成对象信息) Junit performance rely on junit5 and jdk8.(java 性能测试框架。压测测试报告生成。) Fitnesse 完全集成的独立维基和验收测试…

大数据开发--01.初步认识了解

一.环境准备 1.使用虚拟机构建至少三台linux服务器 2.使用公有云来部署服务器 二.大数据相关概念 大数据是指处理和分析大规模数据集的一系列技术、工具和方法。这些数据集通常涉及海量的数据&#xff0c;包括结构化数据&#xff08;如关系型数据库中的表格&#xff09;以及…

美联社报道波场与亚马逊云计算重磅合作 称符合其去中心化使命

近日,波场TRON宣布已集成亚马逊云计算服务(AWS),引发美联社、金融时报、费加罗报等多家海外主流媒体高度关注。报道表示,此次集成旨在利用AWS 强大的云计算资源,降低用户和开发者参与波场网络的准入门槛,打造更加去中心化、更强大的区块链生态系统。 报道内容显示,通过此次合作…

基于spring boot的民宿预约管理系统的设计与实现

目录 摘要 I Abstract II 一、绪论 1 &#xff08;一&#xff09;研究背景 1 &#xff08;二&#xff09;社会调查 1 &#xff08;三&#xff09;研究意义 2 &#xff08;四&#xff09;研究内容 2 二、关键技术介绍 3 &#xff08;一&#xff09;Spring Boot框架 3 &#xff…

GESP2024年3月C++语言三级答案(均为自己的想法,C++没学太多,有不对的地方欢迎指正)

选择题&#xff08;每题2分&#xff0c;共30分&#xff09; 第 1 题 整数-5的16位补码表示是(D)。 A. 1005 B. 1006 C. FFFA D. FFFB 解析&#xff1a;0是FFFF&#xff0c;用0-5&#xff08;即FFFF-5&#xff09;得到是FFFB。 第 2 题 如果16位短整数-2的二进制是“FFFE”&…

蓝桥杯-带分数

法一 /* 再每一个a里去找c,他们共用一个st数组,可以解决重复出现数字 通过ac确定b,b不能出现<0 b出现的数不能和ac重复*/import java.util.Scanner;public class Main {static int n,res;static boolean[] st new boolean[15];static boolean[] backup new boolean[15];…

YOLOv9改进策略:注意力机制 | 用于微小目标检测的上下文增强和特征细化网络ContextAggregation,助力小目标检测,暴力涨点

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文改进内容&#xff1a;用于微小目标检测的上下文增强和特征细化网络ContextAggregation&#xff0c;助力小目标检测 yolov9-c-ContextAggregation summary: 971 layers, 51002153 parameters, 51002121 gradients, 238.9 GFLOPs 改…

springboot277流浪动物管理系统

流浪动物管理系统设计与实现 摘 要 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以&#xff0c;对流…

PSCA系统控制集成之复位层次结构

PPU 提供以下对复位控制的支持。 • 复位信号Reset signals&#xff1a;PPU 提供冷复位和热复位输出信号。PPU 还为实现部分保留的电源域管理提供了额外的热复位输出信号。 • 电源模式控制Power mode control&#xff1a;PPU 硬件适当地管理每个支持的电源模式转换的复位信号…

2024蓝桥杯每日一题(DFS)

备战2024年蓝桥杯 -- 每日一题 Python大学A组 试题一&#xff1a;奶牛选美 试题二&#xff1a;树的重心 试题三&#xff1a;大臣的差旅费 试题四&#xff1a;扫雷 试题一&#xff1a;奶牛选美 【题目描述】 听说最近两斑点的奶牛最受欢迎&#xff0c;…

面试经典-34-验证回文串

题目 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给你一个字符串 s&#xff0c;如果它是 回文串 &#xff0c;返回 true &#xff1b;否则…

航迹数据优化方案

文章目录 引言I 轨迹数据模型II 轨迹信息索引III 数据同步方案3.1 多服务器多表同步3.2 增量数据同步3.3 执行IV 动态表的同步4.1 利用变量进行动态日期表名拼接其他方案引言 重点: ES索引的设计:航迹索引和船的最新位置信息索引梳理出存储航迹的主服务器,测试多服务器多动…