JUC 02

今天是2025/03/27 8:55 day 13

总路线请移步主页Java大纲相关文章

今天进行JUC 3,4,5 个模块的归纳

首先是JUC的相关内容概括的思维导图

JUC 02_第1张图片

由于内容比较多且重要

个人还整理了一份详细JUC的思维导图,需要的请评论。是 xmind文件

 

 


3. 并发集合

  1. ConcurrentHashMap

    • 实现原理

      • JDK 1.7 使用分段锁(Segment),每个段独立加锁,提升并发度。

      • JDK 1.8 改为 CAS + synchronized,锁粒度细化到单个链表节点或红黑树根节点,写操作仅锁冲突部分。

    • 特性

      • 读操作无锁(通过 volatile 保证可见性)。

      • size() 方法通过基础计数器(baseCount)和辅助计数器估算,非精确值。

    • 适用场景:高并发读写的键值存储,如缓存。

  2. CopyOnWriteArrayList/Set

    • 实现原理

      • 写操作(如 add)时复制新数组,修改后替换原数组。读操作直接访问原数组,无锁。

    • 特性

      • 写性能差(复制开销大),适合读多写极少场景(如监听器列表)。

      • 迭代器遍历的是旧数组,不会反映后续修改。

  3. 阻塞队列

    • ArrayBlockingQueue

      • 基于数组,有界队列,生产者-消费者模型,使用 ReentrantLock 控制并发。

    • LinkedBlockingQueue

      • 基于链表,默认无界(Integer.MAX_VALUE),可指定容量。吞吐量通常高于数组队列。

    • PriorityBlockingQueue

      • 无界优先级队列,元素按自然顺序或 Comparator 排序。

    • DelayQueue

      • 元素需实现 Delayed 接口,按延迟时间排序,用于定时任务调度。

    • LinkedTransferQueue

      • 支持“转移”模式(transfer()),生产者阻塞直到消费者取走元素。


4. 同步器(Synchronizers)

  1. CountDownLatch

    • 作用:一次性栅栏,主线程等待多个子任务完成。

    • 核心方法

      • countDown():计数器减 1。

      • await():阻塞直到计数器归零。

    • 场景:服务启动时等待所有组件初始化完成。

  2. CyclicBarrier

    • 作用:可重复使用的栅栏,线程到达后等待,直到所有线程就绪。

    • 特性

      • 支持重置(reset())和回调(Runnable 任务在所有线程到达后执行)。

    • 场景:多线程分阶段处理数据(如并行计算后汇总结果)。

  3. Semaphore

    • 作用:控制同时访问资源的线程数(如限流)。

    • 核心方法

      • acquire():获取许可(若无可用则阻塞)。

      • release():释放许可。

    • 模式

      • 公平模式(按请求顺序分配)与非公平模式(允许插队)。

  4. Exchanger

    • 作用:两个线程间交换数据,适用于生产者-消费者协作。

    • 场景:一个线程生成数据,另一个线程处理数据,通过交换缓冲区提高效率。


5. 执行器框架(Executor)

  1. 核心接口

    • Executor:基础接口,定义 execute(Runnable)

    • ExecutorService:扩展生命周期管理(shutdown())和任务提交(submit() 返回 Future)。

  2. 线程池实现

    • ThreadPoolExecutor

      • 参数

        • corePoolSize:核心线程数(即使空闲也不回收)。

        • maxPoolSize:最大线程数(队列满时创建新线程)。

        • keepAliveTime:非核心线程空闲存活时间。

        • workQueue:任务队列(如 ArrayBlockingQueue)。

        • RejectedExecutionHandler:拒绝策略(默认抛出异常)。

      • 拒绝策略

        • AbortPolicy(默认)、CallerRunsPolicy(提交者执行任务)、DiscardPolicy(静默丢弃)。

    • ScheduledThreadPoolExecutor

      • 支持定时(schedule())和周期性任务(scheduleAtFixedRate())。

      • 内部使用 DelayQueue 存储任务,按触发时间排序。

  3. 工具类 Executors

    • 常用工厂方法

      • newFixedThreadPool(int):固定线程数,无界队列(慎防 OOM)。

      • newCachedThreadPool():无界线程池,适合短时异步任务。

      • newSingleThreadExecutor():单线程串行执行任务。

    • 风险:无界队列(如 LinkedBlockingQueue)可能导致内存溢出。

  4. 异步结果处理

    • Future

      • 通过 get() 阻塞获取结果,支持超时和取消任务。

    • Callable

      • 类似 Runnable,但可返回结果或抛出异常。


关键对比与最佳实践

  • ConcurrentHashMap vs Hashtable

    • ConcurrentHashMap 锁粒度更细,并发性能更高。

  • CountDownLatch vs CyclicBarrier

    • CountDownLatch 一次性,由主线程等待;CyclicBarrier 可重复,线程相互等待。

  • 线程池配置

    • CPU 密集型:线程数 ≈ CPU 核心数。

    • IO 密集型:线程数可适当增加(如 2 * CPU 核心数)。

    • 避免无界队列,使用 ThreadPoolExecutor 自定义参数。

 

你可能感兴趣的:(java,spring,intellij-idea,jvm)