java正则表达式匹配数字和小数点,快来收藏!

2023-11-01

1.为什么要使用分布式锁

使用分布式锁的目的,无外乎就是保证同一时间只有一个客户端可以对共享资源进行操作。

1.1举一个很长的例子

系统 A 是一个电商系统,目前是一台机器部署,系统中有一个用户下订单的接口,但是用户下订单之前一定要去检查一下库存,确保库存足够了才会给用户下单。由于系统有一定的并发,所以会预先将商品的库存保存在 Redis 中,用户下单的时候会更新 Redis 的库存。此时系统架构如下:

但是这样一来会产生一个问题:假如某个时刻,Redis 里面的某个商品库存为 1。

此时两个请求同时到来,其中一个请求执行到上图的第 3 步,更新数据库的库存为 0,但是第 4 步还没有执行。

而另外一个请求执行到了第 2 步,发现库存还是 1,就继续执行第 3 步。这样的结果,是导致卖出了 2 个商品,然而其实库存只有 1 个。

很明显不对啊!这就是典型的库存超卖问题。此时,我们很容易想到解决方案:用锁把 2、3、4 步锁住,让他们执行完之后,另一个线程才能进来执行第 2 步。

按照上面的图,在执行第 2 步时,使用 Java 提供的 Synchronized 或者 ReentrantLock 来锁住,然后在第 4 步执行完之后才释放锁。

这样一来,2、3、4 这 3 个步骤就被“锁”住了,多个线程之间只能串行化执行

当整个系统的并发飙升,一台机器扛不住了。现在要增加一台机器,如下图:

增加机器之后,系统变成上图所示,假设此时两个用户的请求同时到来,但是落在了不同的机器上,那么这两个请求是可以同时执行了,还是会出现库存超卖的问题。

因为上图中的两个 A 系统,运行在两个不同的 JVM 里面,他们加的锁只对属于自己 JVM 里面的线程有效,对于其他 JVM 的线程是无效的。

因此,这里的问题是:Java 提供的原生锁机制在多机部署场景下失效了,这是因为两台机器加的锁不是同一个锁(两个锁在不同的 JVM 里面)。

那么,我们只要保证两台机器加的锁是同一个锁,问题不就解决了吗?此时,就该分布式锁隆重登场了。

分布式锁的思路是:在整个系统提供一个全局、唯一的获取锁的“东西”,然后每个系统在需要加锁时,都去问这个“东西”拿到一把锁,这样不同的系统拿到的就可以认为是同一把锁。

至于这个“东西”,可以是 Redis、Zookeeper,也可以是数据库。此时的架构如图:

通过上面的分析,我们知道了库存超卖场景在分布式部署系统的情况下使用 Java 原生的锁机制无法保证线程安全,所以我们需要用到分布式锁的方案。

2.高效的分布式锁

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java正则表达式匹配数字和小数点,快来收藏! 的相关文章

  • 在 Java 中连接和使用 Cassandra

    我已经阅读了一些关于 Cassandra 是什么以及它可以做什么的教程 但我的问题是如何在 Java 中与 Cassandra 交互 教程会很好 如果可能的话 有人可以告诉我是否应该使用 Thrift 还是 Hector 哪一个更好以及为什
  • Java new Date() 打印

    刚刚学习 Java 我知道这可能听起来很愚蠢 但我不得不问 System out print new Date 我知道参数中的任何内容都会转换为字符串 最终值是 new Date 返回对 Date 对象的引用 那么它是如何打印这个的呢 Mo
  • Java中反射是如何实现的?

    Java 7 语言规范很早就指出 本规范没有详细描述反射 我只是想知道 反射在Java中是如何实现的 我不是问它是如何使用的 我知道可能没有我正在寻找的具体答案 但任何信息将不胜感激 我在 Stackoverflow 上发现了这个 关于 C
  • 如何找到给定字符串的最长重复子串

    我是java新手 我被分配寻找字符串的最长子字符串 我在网上研究 似乎解决这个问题的好方法是实现后缀树 请告诉我如何做到这一点或者您是否有任何其他解决方案 请记住 这应该是在 Java 知识水平较低的情况下完成的 提前致谢 附 测试仪字符串
  • 制作一个交互式Windows服务

    我希望我的 Java 应用程序成为交互式 Windows 服务 用户登录时具有 GUI 的 Windows 服务 我搜索了这个 我发现这样做的方法是有两个程序 第一个是服务 第二个是 GUI 程序并使它们进行通信 服务将从 GUI 程序获取
  • 加速代码 - 3D 数组

    我正在尝试提高我编写的一些代码的速度 我想知道从 3d 整数数组访问数据的效率如何 我有一个数组 int cube new int 10 10 10 我用价值观填充其中 然后我访问这些值数千次 我想知道 由于理论上所有 3d 数组都存储在内
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • 禁止的软件包名称:java

    我尝试从数据库名称为 jaane 用户名 Hello 和密码 hello 获取数据 错误 java lang SecurityException Prohibited package name java at java lang Class
  • 如何将 pfx 文件转换为 jks,然后通过使用 wsdl 生成的类来使用它来签署传出的肥皂请求

    我正在寻找一个代码示例 该示例演示如何使用 PFX 证书通过 SSL 访问安全 Web 服务 我有证书及其密码 我首先使用下面提到的命令创建一个 KeyStore 实例 keytool importkeystore destkeystore
  • 为什么HashMap不能保证map的顺序随着时间的推移保持不变

    我在这里阅读有关 Hashmap 和 Hashtable 之间的区别 http javarevisited blogspot sg 2010 10 difference Between hashmap and html http javar
  • getResourceAsStream() 可以找到 jar 文件之外的文件吗?

    我正在开发一个应用程序 该应用程序使用一个加载配置文件的库 InputStream in getClass getResourceAsStream resource 然后我的应用程序打包在一个 jar文件 如果resource是在里面 ja
  • 总是使用 Final?

    我读过 将某些东西做成最终的 然后在循环中使用它会带来更好的性能 但这对一切都有好处吗 我有很多地方没有循环 但我将 Final 添加到局部变量中 它会使速度变慢还是仍然很好 还有一些地方我有一个全局变量final 例如android Pa
  • 如何在控制器、服务和存储库模式中使用 DTO

    我正在遵循控制器 服务和存储库模式 我只是想知道 DTO 在哪里出现 控制器应该只接收 DTO 吗 我的理解是您不希望外界了解底层域模型 从领域模型到 DTO 的转换应该发生在控制器层还是服务层 在今天使用 Spring MVC 和交互式
  • AWS 无法从 START_OBJECT 中反序列化 java.lang.String 实例

    我创建了一个 Lambda 函数 我想在 API 网关的帮助下通过 URL 访问它 我已经把一切都设置好了 我还创建了一个application jsonAPI Gateway 中的正文映射模板如下所示 input input params
  • 仅将 char[] 的一部分复制到 String 中

    我有一个数组 char ch 我的问题如下 如何将 ch 2 到 ch 7 的值合并到字符串中 我想在不循环 char 数组的情况下实现这一点 有什么建议么 感谢您花时间回答我的问题 Use new String value offset
  • Java执行器服务线程池[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果我使用 Executor 框架在
  • Google App Engine 如何预编译 Java?

    App Engine 对应用程序的 Java 字节码使用 预编译 过程 以增强应用程序在 Java 运行时环境中的性能 预编译代码的功能与原始字节码相同 有没有详细的信息这是做什么的 我在一个中找到了这个谷歌群组消息 http groups
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • 编译器抱怨“缺少返回语句”,即使不可能达到缺少返回语句的条件

    在下面的方法中 编译器抱怨缺少退货声明即使该方法只有一条路径 并且它包含一个return陈述 抑制错误需要另一个return陈述 public int foo if true return 5 鉴于Java编译器可以识别无限循环 https
  • 如何修复 JNLP 应用程序中的“缺少代码库、权限和应用程序名称清单属性”?

    随着最近的 Java 更新 许多人都遇到了缺少 Java Web Start 应用程序的问题Codebase Permissions and Application name体现属性 尽管有资源可以帮助您完成此任务 但我找不到任何资源综合的

随机推荐

  • python程序设计心得体会感想-python实训心得体会

    技术文档 主体内容 可以认为是页面最想表达的内容总和 对于内容详情页来说 主体内容指从标题开始至正文内容结束 翻页区域也被视为主体内容 文章后的评论 分享 推荐等不视为主体内容 首屏 用户点击搜索结果后进入移动页面 不滑动屏幕即看到的所有内
  • HashMap为什么要使用红黑树

    在JDK1 8之后 Java对HashMap做了改进 在链表长度大于8的时候 将后面的数据存到红黑树中 以加快检索速度 红黑树也是一种平衡二叉树 每个节点有一个储存位表示节点的颜色 可以是红色或者黑色 通过对任意一条从根到叶子的路径上各个节
  • C++编程习惯与编程要点

    假设现在我们要实现一个复数类complex 在类的实现过程中探索良好的编程习惯 Header 头文件 中的防卫式声明 complex h ifndef COMPLEX define COMPLEX class complex endif 防
  • 专利与论文-2:什么是专利?专利的几种类型?

    目录 1 什么是知识产权 2 什么是专利 3 专利的主要类型 1 什么是知识产权 知识产权 是关于人类在社会实践中创造的智力劳动成果的专有权利 各种智力创造比如发明 外观设计 文学和艺术作品 以及在商业中使用的标志 名称 图像 都可被认为是
  • 现在的00后,真是卷死了呀,辞职信已经写好了·····

    谁说00后躺平了 但是有一说一 该卷的还是卷 这不 上个月我们公司来了个00后 工作没两年 跳槽到我们公司起薪22K 都快接近我了 后来才知道人家是个卷王 从早干到晚就差搬张床到工位睡觉了 最近和他聊了一次天 原来这位小老弟家里条件不太好
  • python计算机视觉编程第六章 图像聚类

    图像聚类 图像聚类 什么是聚类 举个简单的例子 给出了左图中的点的数据 对其划分为三类 这个过程就叫做聚类 聚类实际上就是根据数据的特征进行分类 把相似的东西分在一起 难点 聚类是无监督的 如何在无监督的情况下尽可能分出更好的类别来是一个比
  • [管理与领导-63]:IT基层管理者 - 潜技能 - 1 - 职场中的陷阱 - 看清楚职场中的霸凌现象

    目录 前言 1 打击自尊心 2 孤立他人 3 恶意针对 4 当众羞辱 5 持续性否定 前言 职场中 什么样的人都有 害人之心不可有 防人之心不可无 前者教人从善 后者教善人如何保护自己受到 坏人 的伤害 有一种情形 每天上班都陷入抑郁 总是
  • 面向对象练习题-第十三天

    练习1 基础 建立一个学生类 其中成员变量为学号 姓名 及三门课的成绩 数组 另建立一个包含主方法的类 定义2个学生类的对象 1 Student package com hpe java import java util Arrays 建立
  • 【ElementUI】日期选择器时间选择范围限制

    ElementUI 日期选择器时间选择范围限制 根据接口灵活设置可选时间 只能选今天之前的时间 或者是只能选今天之后的时间 今天是否可以选 限制结束日期不能大于开始日期
  • 【计算机操作系统】第八章 网络操作系统

    1 计算机网络概述 ARPA 网 gt Internet 1 1 计算机网络的拓扑结构 1 2 计算机广域网络 计算机网络分为广域网和局域网两类 公用交换电话网 分组交换网 帧中继网 异步传输模式 ATM 1 3 计算机局域网络 基本局域网
  • 华为OD机试 C++ 字符串化繁为简

    描述 给你一串只包含英文字母 无论大写或小写 和小括号的字符 注意 小括号总是成对出现 并且不会互相嵌套 小括号里的英文字母表示它们之间是等价的 比如在 ab 里 a 和 b 是等价的 而在 bc 里 b 和 c 是等价的 因此 a b 和
  • 图像融合算法(像素级)

    图像融合技术可以提取自然光图像和红外图像的互补信息 获得对同一场景描述解释更为准确 全面和可靠的图像 像素级融合是常用于灰度图像与可见光图像的融合 基于源图像的彩色化就是源图像和目标图像的融合过程 使其同时兼有源图像的颜色和目标图像的形状
  • 计算机专业毕设论文题目大全(二)

    这一期为大家整理了计算机专业常见的论文题目 需要参考资料的同学可以直接点击后面链接下载 没有链接的可以添加微信biyezhan007来获取资源 序号 题目 下载链接 101 基于Android的跃动旋律音游app的设计与实现 102 基于A
  • 【开发工具-Guava】新集合类型

    1 概述 转载 新集合类型 Guava引入了很多JDK没有的 但我们发现明显有用的新集合类型 这些新类型是为了和JDK集合框架共存 而没有往JDK集合抽象中硬塞其他概念 作为一般规则 Guava集合非常精准地遵循了JDK接口契约 2 Mul
  • 【学习笔记】深入浅析BIO、NIO、AIO

    BIO NIO AIO Java的I O演进之路 I O模型 就是用什么样的通道或者说是通信模式和架构进行数据的传输和接收 很大程度上决定了程序通信的性能 Java共支持3种网络编程的I O模型 BIO NIO AIO 实际 通行需求下 要
  • electron-vue 使用remote 模块 进行多个子窗口的关闭

    remote 模板在13版本后禁用了 至于我为什么用它 是因为一个功能的原因 多个子窗口可以进行对应的操作事件后单独关闭当前的某一个子窗口 1 先进行下载 npm yarn install save electron remote 2 需要
  • Python 代码执行超时判断

    通过 signal 信号处理函数 import signal 自定义异常类 继承自BaseException 这样Exception就捕获不到 class TimeoutException BaseException pass 超时信号函数
  • PCL 由点云生成深度图像

    前言 在电脑上的pcl1 8 0版本可能是由于版本问题 无法在窗口显示深度图像 但是深度图像确实是生成了的 可以通过一个API将深度图像保存为一个png格式的图片然后查看 该函数如下 save rangeImage 相关的头文件 inclu
  • BDCN论文学习

    1 Dilated Convolutions 图像语义分割最核心的两个地方是用pooling下采样减小图像尺寸增大感受野 另一个是用deconv反卷积上采样增大图像尺寸 是用pooling可以增大感受野但是会带来信息损失 若是不用pooli
  • java正则表达式匹配数字和小数点,快来收藏!

    1 为什么要使用分布式锁 使用分布式锁的目的 无外乎就是保证同一时间只有一个客户端可以对共享资源进行操作 1 1举一个很长的例子 系统 A 是一个电商系统 目前是一台机器部署 系统中有一个用户下订单的接口 但是用户下订单之前一定要去检查一下