首页 > 编程语言 >【面试实战】# 并发编程

【面试实战】# 并发编程

时间:2024-06-19 11:54:16浏览次数:33  
标签:异步 CAS 场景 面试 队列 编程 阻塞 并发 线程

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 操作频繁失败)。
  • 不适合复杂的同步场景(如需要维护多个变量的一致性)。

标签:异步,CAS,场景,面试,队列,编程,阻塞,并发,线程
From: https://www.cnblogs.com/zhengfx/p/18255912

相关文章

  • JUC并发编程第十四章——线程安全集合类
    1 并发集合1.1 线程安全集合分类a.遗留的线程安全集合遗留的线程安全集合如Hashtable,Vectorb.使用Collections装饰的线程安全集合使用Collections装饰的线程安全集合,如:Collections.synchronizedCollectionCollections.synchronizedListCollections.synchroni......
  • 快手面试,什么是矩阵乘法?
    大家好啊,我是董董灿。前几天一个网友在快手拿到了50W的薪资,我立刻就对快手提起了兴趣。你可以来这里回顾一下:快手的AI算法岗,50W的年包羡慕到流泪。这几天我就一直在关注快手的信息,包括快手的薪资待遇、快手的面试情况等。发现快手不仅工资给的足,面试问的也是真的细。比如......
  • 【信息学奥赛】CSP-J/S初赛03 计算机网络与编程语言分类
    第1节计算机网络基础1.1网络的定义所谓计算机网络,就是利用通信线路和设备,把分布在不同地理位置上的多台计算机连接起来。计算机网络是现代通信技术与计算机技术相结合的产物。网络中计算机与计算机之间的通信依靠协议进行。协议是计算机收、发数据的规则。TCP/IP:用于......
  • 2024 AI大模型 常问的问题以及答案(附最新的AI大模型面试大厂题 )
    前言在2024年AI大模型的面试中,常问的问题以及答案可能会涵盖多个方面,包括AI大模型的基础知识、训练过程、应用、挑战和前沿趋势等。由于我无法直接附上174题的完整面试题库及其答案,我将基于提供的信息和当前AI大模型领域的热点,给出一些常见的问题和答案示例。1.基础知识......
  • 【2024最新精简版】Kafka面试篇
    文章目录Kafka和RabbitMQ什么区别讲一讲Kafka架构你们项目中哪里用到了Kafka?为什么会选择使用Kafka?有什么好处?使用Kafka如何保证消息不丢失?消息的重复消费问题如何解决的?Kafka如何保证消费的顺序性?Kafka的高可用机制有了解过嘛?Kafka实现高性能的设计有了解......
  • 面试题-17.16 按摩师
    力扣题目解题思路java代码力扣题目:一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。示例1:输入:[1,2,......
  • 【Android面试八股文】SSL握手的过程都经历过什么?
    文章目录一、为什么要设计SSL/TLS?二、SSL/TLS的历史概述SSL(SecureSocketsLayer)TLS(TransportLayerSecurity)总结三、SSL/TLS加密过程中如何保证公钥不被篡改?公钥加密计算量太大,如何减少耗用的时间?3.1如何保证公钥不被篡改?3.2公钥加密计算量太大,如何......
  • 【Android面试八股文】谈谈你对TCP 流量控制与拥塞控制的理解
    文章目录一、流量控制1.1流量控制的概念1.2滑动窗口1.3零窗口二、拥塞控制2.1拥塞控制的概念2.2慢启动2.3拥塞避免2.4快重传与快恢复2.4.1快重传2.4.2快恢复三、总结TCP的拥塞控制和流量控制虽然采取的动作很相似,但拥塞控制与网......
  • 【Android面试八股文】你说一说什么是双亲委托机制?为什么需要双亲委托机制?
    一、双亲委托机制1.1双亲委托机制概述双亲委托机制是指当一个类加载器收到一个类加载请求时,该类加载器首先会把请求委派给父类加载器。如果父类加载器还存在父类加载器,则会一直向上委派,直至最终交由顶层的启动类加载器完成类加载,每个类加载器都是如此,只有在所......
  • MySQL常见的后端面试题,你会几道?
     为什么分库分表单表数据量过大,会出现慢查询,所以需要水平分表可以把低频、高频的字段分开为多个表,低频的表作为附加表,且逻辑更加清晰,性能更优随着系统的业务模块的增多,放到单库会增加其复杂度,逻辑不清晰,不好维护,所以会对业务进行微服务拆分,同时拆分数据库怎么分库分......