【面试实战】# 并发编程

devtools/2024/10/18 15:45:01/

1.线程状态

请解释 Java 中线程的几种状态,并描述每种状态的特点和转换条件。

  • NEW(新建):线程被创建,但尚未启动。
  • RUNNABLE(可运行):线程正在运行,可能在执行代码,也可能等待操作系统资源。
  • BLOCKED(阻塞):线程在等待监视器锁,以便进入同步块/方法。
  • WAITING(等待):线程等待另一个线程显式地唤醒它(例如,Object.wait()Thread.join())。
  • TIMED_WAITING(计时等待):线程等待另一个线程在指定的时间内唤醒它(例如,Thread.sleep()Object.wait(long timeout))。
  • TERMINATED(终止):线程已完成执行。

线程状态的转换条件包括线程的启动、资源竞争、同步块/方法的进入与退出、以及超时等。

2.synchronized 和 ReentrantLock

synchronizedReentrantLock 有什么区别?在什么情况下会选择使用 ReentrantLock

  • synchronized:是Java中的内置同步机制,修饰方法代码块,使用对象内部的监视器锁。简单易用,但功能有限(如不能尝试锁定、不能定时锁定)。
  • ReentrantLock:是 java.util.concurrent.locks 包中的锁,具有更多的高级功能,如可重入、可定时、可中断的锁定方式,支持公平锁和非公平锁

选择 ReentrantLock 的情况

  • 需要尝试锁定或定时锁定。
  • 需要公平锁定(顺序锁定)。
  • 需要更灵活的锁定机制和条件变量(例如 Condition)。

3.线程池

请说明 ThreadPoolExecutor 类的核心参数及其作用。你会如何调整线程池的配置来应对高并发的需求?

ThreadPoolExecutor 类的核心参数:

  • corePoolSize:核心线程数,线程池中始终保持存活的线程数。
  • maximumPoolSize:最大线程数,线程池中允许的最大线程数。
  • keepAliveTime:线程空闲时间,当线程数超过 corePoolSize 时,超时未任务的线程会被终止。
  • unit:keepAliveTime 的时间单位。
  • workQueue:任务队列,保存等待执行的任务。
  • threadFactory:线程工厂,创建新线程的方式。
  • handler:拒绝策略,当任务无法提交到线程池时的处理方式。

高并发配置建议

  • 根据任务类型调整 corePoolSize 和 maximumPoolSize。
  • 选择合适的队列(有界/无界)避免资源耗尽。
  • 使用合适的拒绝策略(如 CallerRunsPolicy)以防止任务丢失。

4.Future 和 CompletableFuture

FutureCompletableFuture 有何区别?在什么情况下你会选择使用 CompletableFuture

  • Future:表示一个异步计算的结果,可以通过 get() 方法获取计算结果,但会阻塞直到任务完成。适用于简单的异步任务。
  • CompletableFuture:扩展了 Future,提供了更丰富的 API 来进行异步任务的组合和处理(如 thenApplythenAccept)。支持链式调用和异常处理

使用 CompletableFuture 的情况

  • 需要进行多个异步任务的组合。
  • 需要非阻塞地处理异步结果。
  • 需要处理异步计算的异常。

5.阻塞队列

请介绍几种常用的阻塞队列及其适用场景。

常用的阻塞队列:

  • ArrayBlockingQueue:基于数组的有界阻塞队列。
  • LinkedBlockingQueue:基于链表的有界或无界阻塞队列。
  • PriorityBlockingQueue:支持优先级排序的无界阻塞队列。
  • DelayQueue:支持延时获取元素的无界阻塞队列。
  • SynchronousQueue:不存储元素的队列,每个插入操作必须等待对应的移除操作。

适用场景

  • ArrayBlockingQueue:固定容量的场景,避免队列过大。
  • LinkedBlockingQueue:需要动态增长的队列长度场景。
  • PriorityBlockingQueue:需要优先级处理的场景。
  • DelayQueue:需要延迟执行的任务调度场景。
  • SynchronousQueue:生产者和消费者一对一交互的场景。

6.CAS

什么是 CAS(Compare-And-Swap)?它是如何在 Java 中实现的?请描述其优缺点。

CAS(Compare-And-Swap)

  • CAS 是一种无锁算法,用于实现原子操作。通过比较内存中的某个值与预期值,如果相同则修改成新值,否则不修改。
  • 在 Java 中,CAS 通过 sun.misc.Unsafe 类中的方法实现(如 compareAndSwapInt)。

优点

  • 高效,无需阻塞线程。
  • 适合在多线程环境下保证数据一致性。

缺点

  • 可能会导致忙等待(如果 CAS 操作频繁失败)。
  • 不适合复杂的同步场景(如需要维护多个变量的一致性)。

http://www.ppmy.cn/devtools/53476.html

相关文章

PHP框架详解 - CakePHP框架

CakePHP 是一个开源的 PHP Web 应用框架,它遵循 MVC(模型-视图-控制器)设计模式。CakePHP 提供了快速开发的功能,如代码自动生成、数据库交互的 CRUD 操作支持、灵活的路由、模板引擎、表单处理以及其它许多有用的特性22。 CakeP…

java 面试题--基础

文章目录 基础java SE 、 EE 、 ME 的区别jdk 和 jre 区别?java 的日志级别基本数据类型 特性关键字finalabstractsuperswitchfortry catch 接口和抽象类的区别接口抽象类适用场景 类的加载循序静态代码块 传参问题访问修饰符运算符 反射java 里的应用为什么反射的性…

通过编辑器工具改变Inspector锁定状态

是在看一系列视频的时候,看到的,感觉挺有用,就记录下来。 就是这个小锁的按钮,后续可以通过快捷键,快速锁定和解锁。代码里没有加入快捷键控制,有需要用到的可以自己加一下,比较简单 using Uni…

PostgreSQL源码分析——视图查询重写

这里我们分析一下查询重写的过程,主要分析视图的查询重写的过程。通过以下语句进行分析: create table t1(a int, b int); insert into t1 values(1,1); -- 创建视图 create view vt1 as select * from t1; -- 查询 select * from vt1;查询重写过程分析…

MySQL触发器基本结构

1、修改分隔符符号 delimiter $$ 可以修改成$$ //都行 2、创建触发器函数名称 create trigger 函数名 3、什么样的操作触发,操作那个表 after:.....之后触发 before:......之前触发 insert:插入被触发 update:修改被触…

巴西:海外媒体投放,大舍传媒实现企业与巴西媒体间的交流

引言 随着全球化的进程,海外市场的开拓对于企业的发展至关重要。巴西作为南美洲最大的经济体和人口大国,具有巨大的商机。在与巴西媒体的交流中,大舍传媒的投放成为了一种高效的宣传和合作途径。 巴西媒体的多样性 巴西媒体以其丰富多样的…

Advanced RAG 08:使用 Self-RAG 打造高质量、可追溯的 RAG System

编者按: RAG 技术通过检索并利用外部知识源,能够较为有效地提升生成内容的准确性和多样性。然而,经典 RAG 流程也存在一些不足,例如不必要的检索会浪费计算资源,并可能引入无关内容或错误信息,影响生成质量…

【会议征稿,IEEE出版】第四届电气工程与机电一体化技术国际学术会议(ICEEMT 2024,7月5-7)

第四届电气工程与机电一体化技术国际学术会议(ICEEMT 2024)定于2024年7月5-7日在浙江省杭州市隆重举行 。会议主要围绕“电气工程”、“机电一体化” 等研究领域展开讨论,旨在为电气工程、机电一体化等领域的专家学者、工程技术人员、技术研发…