• 面试 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+ 访问!

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

  • 相关阅读:
    从javascript到es6的函数、数组、对象、运算符升级
    【控制】自适应控制,模型参考自适应控制,公式推导,有程序有结果图
    postman一些你不常用的实用技巧,竟然还能这么玩
    大学阶段总结
    解决一进页面就会触发trigger: “change“表单校验问题
    Linux虚拟机克隆之后使用ip addr无法获取ip地址
    发票查验API如何打破传统发票管理难题?
    常见的业务分析方法
    linux嵌入式开发所用工具
    SQL语句如何避免在mysql插入重复数据
  • 原文地址:https://blog.csdn.net/qq_67358181/article/details/138628016