JUC常用工具类核心分享

JUC 是 Java 提供的用于多线程处理的工具类库,来看其中的常用工具类的作用,如下图所示。
在这里插入图片描述

如上图所示,第一行的类都是基本数据类型的原子类,包括 AtomicBoolean、AtomicLong、AtomicInteger 类。
AtomicLong 通过 unsafe 类实现,基于CAS。unsafe 类是底层工具类,JUC 中很多类的底层都使用到了 unsafe 包中的功能。unsafe 类提供了类似 C 的指针操作,提供 CAS 等功能。unsafe 类中的所有方法都是 native 修饰的。
LongAdder等 4 个类是 JDK1.8 中提供的更高效的操作类。LongAdder 基于 Cell 实现,使用分段锁思想,是一种空间换时间的策略,更适合高并发场景;LongAccumulator 提供了比 LongAdder 更强大的功能,能够指定对数据的操作规则,例如可以把对数据的相加操作改成相乘操作。

第二行中的类提供了对对象的原子读写功能,后两个类 AtomicStampedReference 和 AtomicMarkableReference 用于解决前面提到的 ABA 问题,分别基于时间戳和标记位来解决问题。
在这里插入图片描述
第一行的类主要是锁相关的类,例如前面介绍过的 Reentrant 重入锁。
与 ReentrantLock 的独占锁不同,Semaphore 是共享锁,允许多个线程共享资源,适用于限制使用共享资源线程数量的场景,例如 100 个车辆要使用 20 个停车位,那么最多允许 20 个车占用停车位。
StampedLock 是JDK 1.8 改进的读写锁,是使用一种 CLH 的乐观锁,能够有效防止写饥饿。所谓写饥饿就是在多线程读写时,读线程访问非常频繁,导致总是有读线程占用资源,写线程很难加上写锁。

第二行中主要是异步执行相关的类。
重点了解 JDK 1.8 中提供的 CompletableFuture,可以支持流式调用,可以方便的进行多 future 的组合使用,例如可以同时执行两个异步任务,然后对执行结果进行合并处理。还可以很方便地设置完成时间。
另外一个是 JDK 1.7 中提供的 ForkJoinPool,采用分治思想,将大任务分解成多个小任务处理,然后在合并处理结果。ForkJoinPool 的特点是使用工作窃取算法,可以有效平衡多任务时间长短不一的场景。
在这里插入图片描述
第一行是常用的阻塞队列,讲解线程池时已经简单介绍过了,这里再补充一些。
LinkedBlockingDeque 是双端队列,也就是可以分别从队头和队尾操作入队、出队。
ArrayBlockingQueue 单端队列,只能从队尾入队,队头出队。

第二行是控制多线程协作时使用的类。
CountDownLatch 实现计数器功能,可以用来控制等待多个线程执行任务后进行汇总。
CyclicBarrier 可以让一组线程等待至某个状态之后,再全部同时执行,一般在测试时使用,可以让多线程更好的并发执行。
Semaphore 用来控制对共享资源的访问并发度。

最后一行是比较常用的两个集合类,这里可以了解 CopyOnWriteArrayList,COW 通过写入数据时进行 copy 修改,然后更新引用的方式,来消除并行读写中的锁使用,比较适合读多写少,数据量比较小,但是并发非常高的场景。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值