首页 > 编程语言 >并发编程学习

并发编程学习

时间:2022-08-22 12:14:32浏览次数:55  
标签:查完 队列 编程 查询 学习 并发 线程 CountDownLatch

Semaphore

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

应用:实现线程池

CountDownLatch

应用:

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

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

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

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

具体实现:

  1. 两个队列:一个对应订单,一个对应派送单,一对一对消费(一对一关系),保证消费不会出错;

  1. 一个线程查完订单库,一个线程查完派送单库,两个都查完通知第三个线程,但是两个线程查完一次之后还要重复进行操作,就用到了CyclicBarrier同步工具类。

  2. CyclicBarrier可自动重置屏障,就可实现上述功能。

 

并发容器

ConcurrentHashMap和ConcurrentSkipListMap

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

 

阻塞队列

四类:

单端阻塞:使用最多

  • ArrayBlockingQueue:内部持有数组,生产和消费时共用一把锁

  • LinkedBlockingQueue:内部持有链表,生产和消费各用一把锁

  • SynchronousQueue:内部不持有队列,生产者的生产操作必须等待消费者的消费操作

  • LinkedTransferQueue:融合LinkedBlockingQueue和SynchronousQueue,性能更好

  • PriorityBlockingQueue:支持按照优先级出队,存储的对象必须实现Comparable接口,通过里面的compare方法确定优先级

  • DelayQueue:支持延时出队,应用:缓存系统的设计,轮询取数,一旦有数可以取出说明失效时间到了

单端非阻塞:ConcurrentLinkedQueue

双端阻塞:LinkedBlockingDeque

双端非阻塞:ConcurrentLinkedDeque

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

标签:查完,队列,编程,查询,学习,并发,线程,CountDownLatch
From: https://www.cnblogs.com/zz01/p/16612389.html

相关文章

  • 01-springcloud学习记录
    SOA架构与微服务区别微服务拆分更加详细,主要以远程相互调用完成业务功能。SOA也是业务拆分,但一个模块内仍然有多个相近业务相互依赖。RestfulAPI是一种软件设计风......
  • OAuth2.0协议安全学习
    有一个问题困扰了很久很久,翻来覆去无法入眠,那就是OAuth2.0有什么安全问题啊?OAuth2.0是一种常用的授权框架,它使网站和Web应用程序能够请求对另一个应用程序上的用户帐户......
  • 2022-08-21 第六小组 高佳誉 学习笔记
    1.JDBC是什么?JavaDataBaseConnectivity(Java语言连接数据库)2.JDBC的本质是什么?JDBC是SUN公司制定的一套接口(interface)java.sql.*;(这个软件包下有很多接口)接口都有调......
  • shell学习
    shell是什么shell是一个命令解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell来启动、挂起、停止甚至是编写一些程序。shell变......
  • 我开源了一个Go学习仓库|笔记预览
    前言大半个月前我参与了字节后端面试,未通过第四面,面试总结写在了这篇文章:https://juejin.cn/post/7132712873351970823在此文的末尾,我写到为了全面回顾Go的知识点,我开始......
  • 8/21 python基础学习4
    第九章类类的创建:classDog:def__init__(self,name,age):#初始化函数self.name=nameself.age=agedefsit(self):pri......
  • Markdown基础学习
    二、标题这是三级标题这是四级标题这是六级标题(主人,不能再多了)通过#+空格来完成标题的设置,#的数量代表几级标题,最多可以设置六级标题二、字体helloword!两边加**表......
  • Python数据库编程
    1.操作SQLite3数据库  Python3.x版本开始,在标准库中已经内置了SQLlite3模块,它可以支持SQLite3数据库的访问和相关的数据库操作。在需要操作SQLite3数据库数据时,只须在......
  • Oracle 序列学习与使用总结
    Oracle序列学习与使用总结by:授客QQ:1033553122简述序列是oracle提供的用于生成一系列数字的数据库对象,序列会自动生成顺序递增的序列号,可用于提供唯一的自动递增主键。......
  • Markdown学习
    Markdown学习二、标题三级标题四级标题六级标题通过#+空格来完成标题的设置,#的数量代表几级标题,最多可以设置六级标题二、字体helloword!两边加**表示加粗hellow......