并发下的集合(代码片段)

bockpecehhe bockpecehhe     2022-12-26     149

关键词:

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());
    
View Code

可能出现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());
    
View Code

错误的加锁  

技术分享图片
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);
    
View Code

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)的简称,是指只允许指定的事件进入系统,超过的部分将被拒绝服... 查看详情