SpringCloud:分布式锁和线程安全

news/2024/11/24 4:26:57/

这篇文章是一个初步了解分布式应用的线程安全和锁的文章,所有截图及代码全部来自亲身实践

1.对于单机应用我们可以把锁加在方法维度(有用,不推荐)

像这样

 但是我们应该缩小锁的范围,我们这里是在派单,避免大于1个订单派给同一个司机,所以锁住司机即可:

 注意这一句中的锁是加在司机的driverId转换为String之后进行intern操作的,这里就不得不看一下intern干了什么

/*** Returns a canonical representation for the string object.* <p>* A pool of strings, initially empty, is maintained privately by the* class {@code String}.* <p>* When the intern method is invoked, if the pool already contains a* string equal to this {@code String} object as determined by* the {@link #equals(Object)} method, then the string from the pool is* returned. Otherwise, this {@code String} object is added to the* pool and a reference to this {@code String} object is returned.* <p>* It follows that for any two strings {@code s} and {@code t},* {@code s.intern() == t.intern()} is {@code true}* if and only if {@code s.equals(t)} is {@code true}.* <p>* All literal strings and string-valued constant expressions are* interned. String literals are defined in section 3.10.5 of the* <cite>The Java&trade; Language Specification</cite>.** @return  a string that has the same contents as this string, but is*          guaranteed to be from a pool of unique strings.*/public native String intern();

简单解释一下重点:

When the intern method is invoked, if the pool already contains a
* string equal to this {@code String} object as determined by
* the {@link #equals(Object)} method, then the string from the pool is
* returned. Otherwise, this {@code String} object is added to the
* pool and a reference to this {@code String} object is returned.

如果常量池中已经包含这个String了直接返回,如果不存在则添加返回这个常量的引用。

所以如果driverId已经被另外一个线程锁了,这里就无法再次锁定了

2.当我们有了多个服务器(或者测试的时候起了多个服务),这个时候我们原来加的锁就锁不住了,本地启动两个服务的情况我们发现两个订单派给了同一个司机,这是不对的

 

只能锁住那个服务内部或者服务器本身的jvm,也就是说我们原来的锁只能保证同一个服务中不会出现同一个资源被多个线程占用。这个时候我们就需要分布式的锁来解决问题,主流就是使用redis来锁

我们这里使用redisson

先添加maven依赖

<dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.17.7</version>
</dependency>

然后创建Redisson的config类(用于创建RedissonClient)

这里使用单机的模式(生产上肯定使用集群) 

使用10个线程压测,都执行成功

 数据库里可以看到只有一个订单派单成功了

 清除数据再来一次

 

都成功了之后我们看一下数据库

 

一样的结果

我这里至少测试了10遍,结果可以看到都是现成安全的。

那是不是真的打到了不同的服务器了呢(是不是分布式的线程安全),当然了

 

 

 对于RedisConfig这个配置类的一些小的优化,主要是为了和其他的用到redis的地方保持一致,而不是上线或者测试的时候就需要修改代码,这也是为了安全,毕竟人都可能犯错,这里我们改成取yml文件中的配置

 yml中的配置是这样的

 代码写的比较粗鄙,大家参考这个思想即可,对于没有接触过的人来说,也算是一个可以参考的例子,面试也用的到


http://www.ppmy.cn/news/159051.html

相关文章

CSS 水平垂直居中的方式

目录 在不知道子元素宽高的情况下&#xff0c;水平垂直居中的六种方式&#xff1a; 1、弹性盒子布局方式来实现&#xff08;flex&#xff09;。 2、绝对定位 transform 3、table标签 4、display&#xff1a;table-cell 5、display: grid 6、writing-mode 属性 在不知道子…

高德地图 Pointer tag for 0x71885cf7d0 was truncated, see ‘https://source.android.com/devices/tech/debug/

记录这个神奇的bug 高德地图升级后莫名奔溃 解决方案 在清单文件中的application里加上android:allowNativeHeapPointerTagging"false"

记录学习二三事

学习二三事 VIM配置与使用 有效链接&#xff1a; Vim 配置入门—阮一峰 Vim入门级配置 Vim的终极配置方案&#xff0c;完美的写代码界面! ——.vimrc Vim插件管理Vim-plug vim插件管理器&#xff1a;Vundle的介绍及安装 遇到的问题&#xff1a; “.vimrc” E510: Can’t mak…

查看 OceanBase 执行计划

一、环境准备 1.下载benchmarksql wget -c https://jaist.dl.sourceforge.net/project/benchmarksql/benchmarksql-5.0.zip unzip benchmarksql-5.0.zip2.编辑配置文件 [admin10 run]$ cd /home/admin/benchmarksql-5.0/run [admin10 run]$ vi props.ob dboracle drivercom.…

CC00025.CloudOpenStack——|OpenStack组件.V01|——|Openstack-controller|启动一实例.V01|

一、实例创建(这也就是我们购买云主机的步骤) ### --- 实例创建(这也就是我们购买云主机的步骤)~~~ 创建秘钥对&#xff1a;提供一个密钥对的认证方式&#xff0c;是可选选项&#xff0c;也是可以自动识别的 ~~~ 启动一个实例&#xff1a;也就是启动一台虚拟机 ~~~ …

html中swiper组件的使用

静态的 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><!-- <link href"https://cdn.bootcdn.net/ajax/libs/Swiper/6.8.1/swiper-bundle.css" rel"stylesheet"> --><…

利用爬虫对《青春有你2》选手信息爬取

import json import re import requests import datetime from bs4 import BeautifulSoup import os#获取当天的日期,并进行格式化,用于后面文件命名&#xff0c;格式:20200420 today datetime.date.today().strftime(%Y%m%d) def crawl_wiki_data():"""爬取…

paddlepaddle(飞桨) python 教学 Day2-《青春有你2》选手信息爬取--解答

&#xff01;&#xff01;&#xff01;作业说明&#xff01;&#xff01;&#xff01; 1.请在下方提示位置&#xff0c;补充代码&#xff0c;完成《青春有你2》选手图片爬取&#xff0c;将爬取图片进行保存&#xff0c;保证代码正常运行 2.打印爬取的所有图片的绝对路径&…