高并发下减少锁竞争

夏日的微笑 夏日的微笑     2022-09-05     407

关键词:

1.减少锁的持有时间,将不需要锁的操作从同步代码块的移除。

 

  1. //可以优化的代码  
  2. class AttributeStore{  
  3.     private final Map<String,String> attributes=new HashMap<String,String>();  
  4.     public synchronized boolean userLocationMatches(String username,String regex){  
  5.         String key="user."+username;  
  6.         String location=attributes.get(key);  
  7.         if(location==null)  
  8.             return false;  
  9.         else  
  10.             return Pattern.matches(regex,location);  
  11.     }  
  12. }  

 

 

 

  1. //优化之后的代码  
  2. class AttributeStore{  
  3.     private final Map<String,String> attributes=new HashMap<String,String>();  
  4.     public boolean userLocationMatches(String username,String regex){  
  5.         String key="user."+username;  
  6.         String location;  
  7.         synchronized (this) {  
  8.             location=attributes.get(key);             
  9.         }  
  10.         if(location==null)  
  11.             return false;  
  12.         else  
  13.             return Pattern.matches(regex,location);  
  14.     }  
  15. }  

2.降低锁的粒度

 

 

  1. //可以锁分解的代码  
  2. class ServerStatus{  
  3.     private  Set<String> users;  
  4.     private  Set<String> queries;  
  5.     public synchronized void addUser(String user){  
  6.         users.add(user);  
  7.     }  
  8.     public synchronized void removeUser(String user){  
  9.         users.remove(user);  
  10.     }  
  11.       
  12.     public synchronized void addQuery(String query){  
  13.         queries.add(query);  
  14.     }  
  15.     public synchronized void removeQuery(String query){  
  16.         queries.remove(query);  
  17.     }     
  18. }  

 

 

  1. //优化后的代码  
  2. class ServerStatus{  
  3.     private  Set<String> users;  
  4.     private  Set<String> queries;  
  5.     public  void addUser(String user){  
  6.         synchronized (users) {  
  7.             users.add(user);  
  8.         }  
  9.     }  
  10.     public  void removeUser(String user){  
  11.         synchronized (users) {  
  12.             users.remove(user);  
  13.         }  
  14.     }  
  15.       
  16.     public  void addQuery(String query){  
  17.         synchronized (queries) {  
  18.             queries.add(query);  
  19.         }  
  20.     }  
  21.     public  void removeQuery(String query){  
  22.         synchronized (queries) {  
  23.             queries.remove(query);  
  24.         }  
  25.     }     
  26. }  

数据存储redis第四章:高并发下实现分布式锁(代码片段)

直接上代码:大部分互联网公司实现分布式锁原理/***分布式锁底层实现原理*@return*/@GetMapping("distributedLock")publicObjectdistributedLock()StringlockKey="distributedLockKey";//给每个线程都设置一个唯一标识,避免出现程序执行的时间超过设置的... 查看详情

数据存储redis第四章:高并发下实现分布式锁(代码片段)

直接上代码:大部分互联网公司实现分布式锁原理/***分布式锁底层实现原理*@return*/@GetMapping("distributedLock")publicObjectdistributedLock()StringlockKey="distributedLockKey";//给每个线程都设置一个唯一标识,避免出现程序执行的时间超过设置的... 查看详情

高并发下乐观锁实现(代码片段)

目前有业务并发更新某业务表,比如用户账户表,可考虑利用数据库乐观锁的办法解决。1、表设计   需要在表中新增version字段,可定义为bigint类型,初始值可设置为02、更新语句mybatis的实现<updateid="updateConsumeStarWit... 查看详情

1.网站高并发下的测试指标及优化泛谈

网站高并发下的测试指标:1.并发量:可以承接多少次请求。2.服务器负载:服务器的cpu/内存消耗。3.平均响应时间:处理一次请求花费的时间。测试高并发时,一般的测试标准是在服务器负载为70%的时候可以处理多少次请求还... 查看详情

分布式高并发下actor模型(代码片段)

写在开始         一般来说有两种策略用来在并发线程中进行通信:共享数据和消息传递。使用共享数据方式的并发编程面临的最大的一个问题就是数据条件竞争。处理各种锁的问题是让人十分头... 查看详情

通过乐观锁(版本号)降低并发时的锁竞争问题

 在高并发下,经常需要处理SELECT之后,在业务层处理逻辑,再执行UPDATE的情况。  若两个连接并发查询同一条数据,然后在执行一些逻辑判断或业务操作后,执行UPDATE,可能出现与预期不相符的结果。  在不使用悲观锁与... 查看详情

高并发下获取mysql自增主键id的解决方案

方案一:跟我来:1、开一个存储过程(不为啥,最近喜欢)2、开一个事务(要上锁了)3、某张表中有某行无关数据,或者就直接再你要用的这张表里吧,省的跳来跳去的。4、给那行数据上行... 查看详情

php和redis实现在高并发下的抢购及秒杀功能示例详解(代码片段)

...简单,但是有些问题需要解决,主要针对两个问题:一、高并发对数据库产生的压力二、竞争状态下如何解决库存的正确减少("超卖"问题)第一个问题,对于PHP来说很简单,用缓存技术就可以缓解数据库压力,比如memcache,redis... 查看详情

高并发下springcloud hystrix的严重问题?

】高并发下springcloudhystrix的严重问题?【英文标题】:seriousissueofspringcloudhystrixunderhighconcurrency?【发布时间】:2018-04-0523:55:24【问题描述】:第1部分我使用HystrixCommand进行服务,并使用jmeter进行高并发测试。测试结果太差了,看... 查看详情

高并发下的static类成员可能存在安全隐患

有一个网友在高并发下使用下面的日期转换工具类时,遇到的问题publicclassDateUtil{privateDateUtil(){}privatestaticfinalDateFormatDATE_FORMAT=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");publicstaticDateparse(Stringdate)throwsParseExcept 查看详情

高并发下接口的并发问题

...会员,限制每个帐号只能领取一个有恶意用户刷接口,在高并发下越过限制。原因领取会员流程:1.后端先生成卡卷,将卡号放到消息队列中2.用户扫码请求领取会员接口2-1).先检查用户是否已经领取过该活动会员2-2).领取过return... 查看详情

redis实现高并发下的抢购/秒杀功能

...lhttps://www.cnblogs.com/TankXiao/p/4045439.html之前写过一篇文章,高并发的解决思路(点此进入查看),今天再次抽空整理下实际场景中的具体代码逻辑实现吧:抢购/秒杀 查看详情

高并发下线程安全的单例模式

...之一,而单例模式有很多种实现方式,你是否都了解呢?高并发下如何保证单例模式的线程安全性呢?如何保证序列化后的单例对象在反序列化后任然是单例的呢?这些问题在看了本文之后都会一一的告诉你答案,赶快来阅读吧... 查看详情

高并发下的web异步处理方案(代码片段)

高并发下的web异步处理方案一、问题介绍​平时web开发时(使用的servlet或者基于servlet封装的SpringMVC框架),业务处理基本都是同步处理,即业务处理与web容器接收线程为同一线程,每一次Http请求都由一个线... 查看详情

漫画:高并发下的hashmap(代码片段)

这一期我们来讲解高并发环境下,HashMap可能出现的致命问题。               HashMap的容量是有限的。当经过多次元素插入,使得HashMap达到一定饱和度时,Key映射位置发生冲突... 查看详情

hashmap并发出现死循环及减少锁的竞争

....com/dongguacai/p/5599100.htmlhttps://coolshell.cn/articles/9606.html 减少锁的竞争3种方法:(1)减少锁的 查看详情

面试实战考核:设计一个高并发下的下单功能(代码片段)

功能需求:设计一个秒杀系统初始方案商品表设计:热销商品提供给用户秒杀,有初始库存。@EntitypublicclassSecKillGoodsimplementsSerializable@IdprivateStringid;/***剩余库存*/privateIntegerremainNum;/***秒杀商品名称*/privateStringgoodsName;秒杀订单表... 查看详情

高并发下,hashmap会产生哪些问题?(代码片段)

HashMap在高并发环境下会产生的问题HashMap其实并不是线程安全的,在高并发的情况下,会产生并发引起的问题:比如:HashMap死循环,造成CPU100%负载触发fail-fast下面逐个分析下出现上述情况的原因:HashMap死循环的原因HashMap进行存... 查看详情