并发编程学习

Semaphore

Semaphore 可以允许多个线程访问一个临界区

应用:实现线程池

CountDownLatch

应用:

业务原始状态:一个线程执行查询订单,查询派送单,对比差异,写入数据库

优化后:多线程并发执行:一个线程查询订单,一个线程查询派送单,一个线程对比差异并写入数据库

问题:线程执行顺序问题,第三个线程必须等其他两个线程把两种订单信息查询出来才可以对比差异,所以使用CountDownLatch,在那两个线程的执行方法体内调用CountDownLatch的countDown()方法,CountDownLatch调用await()方法进行等待。

进一步优化:如果第二次查询操作不需要等待第一次对比差异并写入数据库的操作就可以执行呢,速度又会更快,那么实现一个生产消费者模型就可以,那两个查询订单的线程为生产者,第三个线程为消费者。

具体实现:

并发容器

ConcurrentHashMap和ConcurrentSkipListMap

如果对于ConcurrentHashMap的并发度还不满意就可以考虑使用ConcurrentSkipListMap,因为ConcurrentSkipListMap的时间复杂度为O(logn),且理论上和并发度没有关系。

四类:

单端阻塞:使用最多

  • ArrayBlockingQueue:内部持有数组,生产和消费时共用一把锁
  • LinkedBlockingQueue:内部持有链表,生产和消费各用一把锁
  • SynchronousQueue:内部不持有队列,生产者的生产操作必须等待消费者的消费操作
  • LinkedTransferQueue:融合LinkedBlockingQueue和SynchronousQueue,性能更好
  • PriorityBlockingQueue:支持按照优先级出队,存储的对象必须实现Comparable接口,通过里面的compare方法确定优先级
  • DelayQueue:支持延时出队,应用:缓存系统的设计,轮询取数,一旦有数可以取出说明失效时间到了

单端非阻塞:ConcurrentLinkedQueue

双端阻塞:LinkedBlockingDeque

双端非阻塞:ConcurrentLinkedDeque

但是在实际使用中一般使用有界队列:ArrayBlockingQueue和LinkedBlockingQueue,因为无界队列容易有OOM隐患。

Original: https://www.cnblogs.com/zz01/p/16612389.html
Author: 山野村夫01
Title: 并发编程学习

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/621904/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • SpringBoot整合WebService(实用版)

    SpringBoot整合WebService 简介 WebService就是一种跨编程语言和跨操作系统平台的远程调用技术 此处就不赘述WebService相关概念和原理了,可以参考…

    数据库 2023年6月16日
    0103
  • feign之间传递oauth2-token的问题和解决~续

    之前写过关于修改hystric的隔离《feign之间传递oauth2-token的问题和解决》方式来在feign调用各个微服务中传递token,修改为SEMAPHORE之后,会有一…

    数据库 2023年6月6日
    088
  • Mysql索引底层数据结构与算法

    一.索引概述是什么:索引是帮助MySQL高效获取数据的排好序的数据结构,索引叫”键”,优化好一个索引,可以提高数倍的性能, 类似于字典的音序表为什么要键索引…

    数据库 2023年6月11日
    0115
  • 人的思维定势

    人的思维定势 前段时间,因为咳嗽时间太长,去了医院看”呼吸内科”,检查了一番,最终发现是”变异性咳嗽”,也叫”变异性哮喘…

    数据库 2023年6月9日
    074
  • jdbc分页

    一、最低级分页 resources下的db.properties db.driver=com.mysql.cj.jdbc.Driver db.url=jdbc:mysql://lo…

    数据库 2023年6月9日
    0100
  • vim+vundle配置

    Linux环境下写代码虽然没有IDE,但通过给vim配置几个插件也足够好用。一般常用的插件主要包括几类,查找文件,查找符号的定义或者声明(函数,变量等)以及自动补全功能。一般流程都…

    数据库 2023年6月9日
    092
  • 【JDBC】笔记(4)— JDBC 事务自动提交机制;账户转账演示事务代码(bug版+修正版)

    楔子: JDBC 的事务默认是自动提交的: 只要执行一条 DML语句,则自动提交一次。但是在实际的业务中,通常是多条 DML语句 联合完成的,那么就必须保证这些 DML语句 在同一…

    数据库 2023年5月24日
    0141
  • ArrayLIst在指定位置插入的内部实现

    今天看到一个问题:ArrayList的add方法有两种使用,那么add到指定位置内部是怎么实现的? 发现自己对这块地方不熟悉,所以立马去看了ArrayList下的源码 // 第一个…

    数据库 2023年6月9日
    087
  • 21粤比武

    先进行密码绕过,在这个界面迅速按下方向键,然后按下e进入编辑模式 找到linux16这一行,将lang编码后面的全部删掉,加上 <span class=”ne-text”&g…

    数据库 2023年6月11日
    097
  • 凤凰架构: 构建可靠的大型分布式系统

    推荐一本好书: 《凤凰架构: 构建可靠的大型分布式系统》–作者:周志明 这是一本开源书,同时也已经出版。有着纸质书、电子书、开源网站文档和Github文档。文末已附上链…

    数据库 2023年6月6日
    0104
  • SQL语句的整合

    基础语法 https://blog.csdn.net/m0_37989980/article/details/103413942 CRUD 提供给数据库管理员的基本操作,CRUD(…

    数据库 2023年6月14日
    076
  • Redis集群(一)主从复制

    一、主从复制概述 主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave);数据的复制是单向的,只能由…

    数据库 2023年6月11日
    084
  • 浅谈DDD中的聚合

    DDD分为战略部分跟战术部分,相信大家都认同DDD的核心在战略而非战术。而战略方面的核心我认为在业务建模,领域划分、统一语言等都在为业务建模服务。 为什么业务建模重要? 以前的开发…

    数据库 2023年6月14日
    081
  • 翻译 | 解读首部 Kubernetes 纪录片

    Honeypot.io 自诩为欧洲最大的技术人才招聘平台,同时提供开发者视频网站,又被称其为 ” 开发者的 Netflix“。2022 年 1 月,该公司与…

    数据库 2023年5月24日
    082
  • Mysql_事务_存储过程_触发器

    一、什么是事务? 事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库…

    数据库 2023年6月11日
    093
  • MySQL面试整理

    索引的目的在于提高查询效率,以及添加约束; 常用的索引有: 普通索引,唯一索引,联合索引,全文索引,空间索引… 唯一索引 有两个分类 分别是:主键索引和唯一索引 联合索…

    数据库 2023年6月9日
    0188
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球