并发编程学习

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)

大家都在看

  • Java redisTemplate 使用 increment序列化问题

    添加key: ValueOperations redisTemplate.setValueSerializer(new StringRedisSerializer()); // 设…

    数据库 2023年6月9日
    099
  • 什么?MySQL 8.0 会同时修改两个ib_logfilesN 文件?

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。 GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。 作者介绍:孙黎,GreatDB …

    数据库 2023年6月11日
    095
  • 500 ZuulException: Forwarding error

    com.netflix.zuul.exception.ZuulException: Forwarding error at org.springframework.cloud.ne…

    数据库 2023年6月16日
    077
  • MySQL8.0.x 安装傻瓜式教程【极简】

    MySQL8.0.x 安装 一、下载 MySQL官网下载链接:https://downloads.mysql.com/archives/community/ 选择版本后下载zip文…

    数据库 2023年5月24日
    070
  • 第二十章 AOP开发中的坑

    问题 //在同一个业务类中,一个业务方法调用另一个业务方法 //问题: login方法添加有额外功能 // register方法没有添加额外功能 public class User…

    数据库 2023年6月14日
    063
  • MySQL实战45讲 14

    14 | count(*)这么慢,我该怎么办? 在开发系统时,您可能经常需要计算表中的行数,例如交易系统中的变动记录总数。 [En] When developing a syste…

    数据库 2023年5月24日
    080
  • 数组

    1. 数组概述 数组(array): 存储一个元素个数固定且元素类型相同的有序集 2. 数组的定义格式 格式一 数据类型[] 变量名 int[] array; –>推荐 格…

    数据库 2023年6月14日
    075
  • MySQL 基础

    MySQL 基础 SQL 介绍 SQL (Structured Query Language:结构化查询语言) 是用于管理关系数据库管理系统(RDBMS)。 SQL 的范围包括数据…

    数据库 2023年5月24日
    078
  • 主从复制直接转换MGR_5.7验证试验

    IP port role info 192.168.188.51 4000 node1 master 192.168.188.52 4000 node2 slave1 192.16…

    数据库 2023年6月16日
    0205
  • CentOS服务器的网络配置与部署

    1.系统安装与软件安装 1.1选择CentOs7.9release版本用作所研发系统部署服务器,官网以及所选择镜像为地址为:http://ftp.sjtu.edu.cn/cento…

    数据库 2023年6月6日
    077
  • Nginx 代理超时

    Nginx代理超时 内部测试并未出现问题 但是再客户那边出现了 BUG System.InvalidOperationException: Response Content-Len…

    数据库 2023年6月11日
    065
  • Springboot 注解失效问题 @Async, @Transactional, @Subsribe

    问题描述:在一个Service的某个方法上使用了guava eventbus @subscribe注解,最开始发现没有收到消息,debug发现是该service的该方法没有注册到e…

    数据库 2023年6月11日
    072
  • Java学习-第一部分-第二阶段-第二节:枚举和注释

    自定义类实现枚举 先看一个需求 要求创建季节(Season)对象,请设计并完成。 创建Season对象有如下特点 1.季节的值是有限的几个值(spring, summer, aut…

    数据库 2023年6月11日
    077
  • CISCN2022初赛misc wp

    ez_usb usb流量题,与以前的鼠标流量和键盘流量有所区别,但大同小异 导出所有的HID数据并按照ip分类,之后脚本解码得到压缩包和密码 mappings = { "…

    数据库 2023年6月11日
    0103
  • zabbix监控配置流程

    zabbix监控配置流程 管理层次: 开发人员要加监控,需要让其提供监控指标运营人员要加监控,让其找开发要监控指标运维人员要加监控,让运营人员去找开发要监控指标。 配置层次: 1….

    数据库 2023年6月14日
    077
  • Mybatis基础知识大全!!!

    1. 简介 1.1什么是Mybatis 1.2 如何获得Mybatis 1.3 使用Mybatis的好处: 2.初涉Mybatis 2.1环境搭建 2.2、创建一个模块(项目) 2…

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