首页 > 其他分享 >常见并发工具类的使用场景

常见并发工具类的使用场景

时间:2024-09-08 12:03:47浏览次数:10  
标签:场景 常见 并发 线程 CountDownLatch Semaphore 多线程 ReentrantLock

常见并发工具类的使用场景

ReentrantLock

ReentrantLock是一种可重入的独占锁,它允许同一个线程多次获取同一把锁而不会被阻塞。它的功能类似于synchronized是一种互斥锁,可以保证线程安全。

  • 可中断
  • 可以设置超时时间
  • 可以设置为公平锁
  • 支持多个条件变量
  • 与 synchronized 一样,都支持可重入

主要应用场景:多线程环境下对共享资源进行独占式访问,以保证数据的一致性和安全性。当然我们也可以使用ReentrantLock和Condition实现生产者消费者模式,向ArrayBlockingQueue底层存元素和取元素就是借助ReentrantLock和Condition来实现的。

作为可重入锁常常应用于递归操作、调用同一个类中的其他方法、锁嵌套等场景中

解决多线程竞争资源的问题,例如多个线程同时对同一个数据库进行写操作,可以使用ReentrantLock保证每次只有一个线程能够写入。

实现多线程任务的顺序执行,例如在一个线程执行完某个任务后,再让另一个线程执行任务,主要借助于ReentrantLock的公平锁来实现。

实现多线程等待/通知机制,例如在某个线程执行完某个任务之后,通知其他线程继续执行任务,主要是借助于ReentrantLock和Condition来实现的。

Semaphore

Semaphore是信号量的意思,常用于并发编程中。用于控制同时访问某个资源的线程数量。Semaphore维护了一个计数器,线程可以通过acquire方法来获取许可证,可以通过release方法来释放许可证。当许可证数量为0的时候,再来线程将被阻塞。

Semaphore底层也支持公平锁和非公平锁。当使用公平锁的时候,下一个被执行任务的线程一定是等待时间最久的那个线程。

应用场景:

限流:Semaphore可以用于限制对共享资源的并发访问数量,以控制系统的流量。

资源池:Semaphore可以用于实现资源池,以维护一组有限的共享资源。

CountDownLatch

CountDownLatch是门栓的意思,常用于并发编程中,它可以让多个线程都阻塞在一个地方,直到所有线程任务都执行完成。

常用方法:countDown方法和await方法。

应用场景:

并行任务同步:CountDownLatch用于协调多个并行任务的完成情况,确保所有任务都完成后再继续执行下一步操作。

多任务汇总:CountDownLatch可以用于统计多个线程的完成情况,以确定所有线程都以完成工作。

资源初始化:CountDownLatch可以用于等待资源的初始化完成,以边在初始化完成后开始使用。

CountDownLatch可以阻塞主线程,适用于需要同步返回的接口

CyclicBarrier

CyclicBarrier是循环栅栏的意思,他的特点是可以循环使用,当多个线程都到达同一个指定点的时候,再同时执行。

应用场景:CyclicBarrier可以用于将复杂的任务分配给多个线程执行,并在所有线程完成工作后触发后续的操作。

CyclicBarrier无法阻塞主线程,不适合在需要同步返回的接口中使用。CyclicBarrier适用于异步任务,尤其需要对子线程的执行结果做汇聚计算的更为适合,在大部分场景下,CountDownLatch能实现的功能,都能使用CyclicBarrier实现。

ReentrantReadWriteLock

ReentrantReadWriteLock是读写锁,常用于java编程中。它允许多个线程同时读取数据,但只允许一个线程写入数据。在某些情况下,比方说读多写少的场景中,使用这个类可以提高程序的性能和可靠性。

应用场景:主要用于读多写少的场景。比如:在数据库连接池中,多个线程可能需要同时访问数据库,但是只有一个线程能够执行写操作,如插入、更新或删除数据。使用reentrantreadwritelock可以在保证数据一致性的同时提高并发性能。

ThreadPoolExecutor

ThreadPoolExecutor线程池。ThreadPoolExecutor底层也有使用到ReentrantLock,比如在调用shutdown或shutdownnow或addworker方法的时候都有使用到ReentrantLock加锁。

应用场景:在实际项目开发中,当我们有异步任务要执行的时候,通常会使用多线程。

AQS

AQS 全名叫 AbstractQueuedSynchronizer 抽象队列同步器是 java.util.concurrent.locks 包下的⼀个抽象类,是 JUC 的核⼼

底层基于双向链表来实现。是一种多线程同步器,是juc包下lock锁的底层实现,像以上这些类的底层实现都是基于AQS来实现的。

标签:场景,常见,并发,线程,CountDownLatch,Semaphore,多线程,ReentrantLock
From: https://www.cnblogs.com/dongyaotou/p/18402729

相关文章

  • Mysql高级篇(中)——七种常见的 join 查询图
    注意:MySQL是不支持FULLOUTERJOIN这种语法的,因此要实现图中6、7的查询结果,可以使用UNION关键字结合LEFTJOIN、RIGHTJOIN实现,UNION可以实现去重的效果;参考如下代码:--MySQL中图标6的实现方式SELECT*FROMtableAALEFTJOINtableBBONA.key=B.ke......
  • 常见的网站错误码及其含义
    一、1xx信息性状态码100Continue:表示目前为止一切正常,客户端可以继续发送请求或者忽略这个响应。101SwitchingProtocols:服务器根据客户端的请求切换协议。二、2xx成功状态码200OK:请求成功,一般用于GET和POST请求。201Created:请求成功并且服务器创建了新的资源。202Accep......
  • pod几种常见状态
    在Kubernetes中,Pod的状态反映了其当前的运行情况和健康状况。以下是几种常见的Pod状态:1.Pending描述:Pod已被调度到节点,但尚未启动。可能是由于资源不足(如CPU、内存)或其他原因导致未能创建容器。原因:等待所需资源可用、等待Volume绑定等。2.Running描述:Pod正在运行,至少有......
  • Network Policy使用场景
    Kubernetes中的NetworkPolicy是一种用于控制Pod之间网络通信的机制。它允许用户定义哪些Pod可以相互通信,从而提高集群的安全性和管理性。以下是一些常见的NetworkPolicy使用场景:1.微服务架构中的流量控制在微服务架构中,不同的服务可能需要限制对彼此的访问。通过NetworkPoli......
  • Java 入门指南:Java 并发编程 —— 并发容器 ConcurrentLinkedDeque
    文章目录ConcurrentLinkedDeque特点构造方法常用方法使用示例注意事项ConcurrentLinkedDequeConcurrentLinkedDeque是Java并发工具包(java.util.concurrent包)中的一个线程安全的双端队列(Deque)实现,实现了Deque接口。它使用了链表结构,并且针对高并发环境进行了......
  • 采购管理十大常见问题,你遇到过几次?
    在当今的商业环境中,采购管理已经成为企业运营中至关重要的一环。无论是原材料的采购,还是服务外包的选择,采购环节的效率和质量都会直接影响企业的生产、成本和利润。然而,许多企业在采购过程中经常会遇到各种问题:供应商选择不当、库存管理混乱、采购成本失控等等。这些问题不仅会......
  • 分布式架构下的秒杀优化实战:从高并发到数据一致性
    时间:2024年09月07日作者:小蒋聊技术邮箱:[email protected]微信:wei_wei10音频地址:喜马拉雅希望大家帮个忙!如果大家有工作机会,希望帮小蒋推荐一下,小蒋希望遇到一个认真做事的团队,一起努力。需要简历可以加我微信。大家好,欢迎来到小蒋聊技术,小蒋准备和大家一起聊聊技术的......
  • 【鸿蒙实战开发】基于加解密算法框架的常见规格问题
    往期知识点整理鸿蒙(HarmonyOS)北向开发知识点记录~【鸿蒙实战开发】ArkTS多线程的多线程系列(一):ArkTS多线能力入门【鸿蒙实战开发】ArkTS多线程的多线程系列(二):基于Sendable共享对象实现跨线程通信及UI状态刷新【鸿蒙实战开发】ArkTS多线性的多线程系列(三):基于单例实现跨......
  • evo-e.dll下载陷阱多?evo-e.dll常见错误排查与安全下载指南
    在下载和使用evo-e.dll这类动态链接库文件时,用户确实需要格外注意,因为网络上存在许多潜在的陷阱,如恶意软件伪装、下载来源不可靠等。以下是一份关于evo-e.dll常见错误排查与安全下载的详细指南:一、evo-e.dll常见错误排查文件缺失或损坏:当应用程序提示找不到evo-e.dll文......
  • 数字IC验证笔面试常见100题【持续更新】
    【提要】收集整理了一些网络上和我自己在秋招、实习时遇到的题目,适合数字验证方向求职的同学进行差缺补漏或者应对八股时的速成。    对于时间比较充裕并且有条件的同学,还是强烈建议找个实习来提升自己的能力以及校招竞争性,独立完成了一两个真实项目后,能大大加深对验证......