关键词:
ArrayList是一个线程不安全的容器 如下列程序
package com.longfor.dragonshard.service.cost.standard.impl; import java.util.ArrayList; public class ArrayListMultiThread private static ArrayList arrayList = new ArrayList(); public static class AddThread implements Runnable @Override public void run() for(int i=0;i<10000;i++) arrayList.add(i); public static void main(String[] args) throws InterruptedException Thread t1 = new Thread(new AddThread()); Thread t2 = new Thread(new AddThread()); t1.start(); t2.start(); t1.join(); t2.join(); System.out.println(arrayList.size());
可能出现3中情况:
① 程序正常结束 所以说未必每次错误未必会表现出来
② 扩容过程中没有锁的保护 从而导致访问数据出错
③ 大小被不正常的访问 从而赋值出错
HashMap同样也是线程不安全的 问题比ArrayList更加诡异
package com.longfor.dragonshard.service.cost.standard.impl; import java.util.HashMap; import java.util.Map; public class HashMapMutiThread private static Map map = new HashMap(); public static class AddThread implements Runnable public int start = 0; public AddThread(int start) this.start=start; @Override public void run() for (int i=0;i<10000;i++) map.put(Integer.toString(i),Integer.toBinaryString(i)); public static void main(String[] args) throws InterruptedException Thread t1 = new Thread(new HashMapMutiThread.AddThread(0)); Thread t2 = new Thread(new HashMapMutiThread.AddThread(1)); t1.start(); t2.start(); t1.join(); t2.join(); System.out.println(map.size());
错误的加锁
package com.longfor.dragonshard.service.cost.standard.impl; public class BadLockOnInteger implements Runnable public static Integer i = 0; public static BadLockOnInteger instance = new BadLockOnInteger(); @Override public void run() for (int k=0;k<100000;k++) synchronized (i) i++; public static void main(String[] args) throws InterruptedException Thread t1 = new Thread(instance); Thread t2 = new Thread(instance); t1.start(); t2.start(); t1.join(); t2.join(); System.out.println(i);
Integer属于不变的对象 所以每次新增的时候都是新建一个新的Integer对象 重新赋值 i = Integer.valueOf(i.intValue()+1);
进一步查看valueOf
public static Integer valueOf(int i)
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
创建新的Integer对象 所以我们不能对Integer进行同步 因为Integer对象一直在改变
高并发下的web异步处理方案(代码片段)
高并发下的web异步处理方案一、问题介绍平时web开发时(使用的servlet或者基于servlet封装的SpringMVC框架),业务处理基本都是同步处理,即业务处理与web容器接收线程为同一线程,每一次Http请求都由一个线... 查看详情
高并发下,hashmap会产生哪些问题?(代码片段)
HashMap在高并发环境下会产生的问题HashMap其实并不是线程安全的,在高并发的情况下,会产生并发引起的问题:比如:HashMap死循环,造成CPU100%负载触发fail-fast下面逐个分析下出现上述情况的原因:HashMap死循环的原因HashMap进行存... 查看详情
面试实战考核:设计一个高并发下的下单功能(代码片段)
功能需求:设计一个秒杀系统初始方案商品表设计:热销商品提供给用户秒杀,有初始库存。@EntitypublicclassSecKillGoodsimplementsSerializable@IdprivateStringid;/***剩余库存*/privateIntegerremainNum;/***秒杀商品名称*/privateStringgoodsName;秒杀订单表... 查看详情
数据存储redis第四章:高并发下实现分布式锁(代码片段)
直接上代码:大部分互联网公司实现分布式锁原理/***分布式锁底层实现原理*@return*/@GetMapping("distributedLock")publicObjectdistributedLock()StringlockKey="distributedLockKey";//给每个线程都设置一个唯一标识,避免出现程序执行的时间超过设置的... 查看详情
数据存储redis第四章:高并发下实现分布式锁(代码片段)
直接上代码:大部分互联网公司实现分布式锁原理/***分布式锁底层实现原理*@return*/@GetMapping("distributedLock")publicObjectdistributedLock()StringlockKey="distributedLockKey";//给每个线程都设置一个唯一标识,避免出现程序执行的时间超过设置的... 查看详情
高并发下秒杀商品,你必须知道的9个细节(代码片段)
前言高并发下如何设计秒杀系统?这是一个高频面试题。这个问题看似简单,但是里面的水很深,它考查的是高并发场景下,从前端到后端多方面的知识。秒杀一般出现在商城的促销活动中,指定了一定数量... 查看详情
美团2020面试题:基于volatile变量的运算在并发下是安全的吗?(代码片段)
答案:不安全(不可以保证变量符合操作的原子性)案例分析:publicclassVolatileDemoprivatevolatileintnumber=0;publicintgetNumber()returnnumber;publicvoidadd()number++;publicstaticvoidmain(Stri 查看详情
高并发下如何避免产生重复数据?(代码片段)
前言最近测试给我提了一个bug,说我之前提供的一个批量复制商品的接口,产生了重复的商品数据。追查原因之后发现,这个事情没想象中简单,可以说一波多折。1.需求产品有个需求:用户选择一些品牌... 查看详情
高并发下如何避免产生重复数据?(代码片段)
前言最近测试给我提了一个bug,说我之前提供的一个批量复制商品的接口,产生了重复的商品数据。追查原因之后发现,这个事情没想象中简单,可以说一波多折。1.需求产品有个需求:用户选择一些品牌... 查看详情
高并发下秒杀商品,你必须知道的9个细节(代码片段)
大家好,我是苏三,又跟大家见面了。前言高并发下如何设计秒杀系统?这是一个高频面试题。这个问题看似简单,但是里面的水很深,它考查的是高并发场景下,从前端到后端多方面的知识。秒杀一般出... 查看详情
httpclient高并发下性能优化-http连接池(代码片段)
首先,明确三点:1.http连接池不是万能的,过多的长连接会占用服务器资源,导致其他服务受阻2.http连接池只适用于请求是经常访问同一主机(或同一个接口)的情况下3.并发数不高的情况下资源利用率低下那么,当你的业务符合上面3点,... 查看详情
高并发下保证接口的幂等性的几种方式(代码片段)
高并发下保证接口的幂等性的几种方式--洱涷Zz场景不知道你有没有遇到过这些场景:有时我们在填写某些form表单时,保存按钮不小心快速点了两次,表中竟然产生了两条重复的数据,只是id不一样。我们在项目... 查看详情
高并发下保证接口的幂等性的几种方式(代码片段)
高并发下保证接口的幂等性的几种方式--洱涷Zz场景不知道你有没有遇到过这些场景:有时我们在填写某些form表单时,保存按钮不小心快速点了两次,表中竟然产生了两条重复的数据,只是id不一样。我们在项目... 查看详情
高并发下秒杀商品,这9个细节得知道(代码片段)
大家好,我是bigsai,又跟大家见面了。前言高并发下如何设计秒杀系统?这是一个高频面试题。这个问题看似简单,但是里面的水很深,它考查的是高并发场景下,从前端到后端多方面的知识。秒杀一般出... 查看详情
高并发下的批量处理与单个处理(利用jdk8新特性处理,提高性能)(代码片段)
1、技术选型:SpringBoot2、案例:实体类:packagecom.zhangwl.complicatedemo.pojo;importjava.sql.Timestamp;/***@ClassNameGoods*@Description*@Authorzhangwl*@Date2019/10/30:54*@Version1.0**/publicclassGoodsprivateStrin 查看详情
高并发下service层的写法(代码片段)
最近在项目里遇到一个坑,先上简易版的描述:每次从库里查询一下库存余量,每次购买一个商品。数据库:store为库存量。service层代码:@Overridepublicsynchronizedvoidsell()System.out.println("<======"+System.currentTimeMillis());//根据局id获取... 查看详情
全网最全的高并发下常见的限流算法!(代码片段)
限流简介现在说到高可用系统,都会说到高可用的保护手段:缓存、降级和限流,本博文就主要说说限流。限流是流量限速(RateLimit)的简称,是指只允许指定的事件进入系统,超过的部分将被拒绝服... 查看详情
高并发下常见的限流算法都在这了!(代码片段)
限流简介现在说到高可用系统,都会说到高可用的保护手段:缓存、降级和限流,本博文就主要说说限流。限流是流量限速(RateLimit)的简称,是指只允许指定的事件进入系统,超过的部分将被拒绝服... 查看详情