首页 > 其他分享 >多线程并发修改集合案例

多线程并发修改集合案例

时间:2023-07-24 22:23:01浏览次数:36  
标签:案例 int arrayList list batch copyOnWriteArrayList 并发 多线程 size

        //单线程使用  修改集合
        ArrayList arrayList = new ArrayList();
        for (int i = 0; i < 100; i++) {
            arrayList.add(i);
        }
        int batch = 10;
        int size = arrayList.size();
        if (0 < size && size <= batch) {
            List list = arrayList.subList(0, size);
            System.out.println(">>>>>>>>>>>>:" + JSON.toJSONString(list));
        } else {
            int flag = size % batch == 0 ? size / batch : size / batch + 1;
            for (int i = 0; i < flag; i++) {
                if (i == flag - 1) {
                    List list = arrayList.subList(0, arrayList.size());
                    System.out.println(">>>>>>>>>>>>:" + JSON.toJSONString(list));
                    arrayList.removeAll(list);
                } else {
                    List list = arrayList.subList(0, batch);
                    System.out.println(">>>>>>>>>>>>:" + JSON.toJSONString(list));
                    arrayList.removeAll(list);
                }
            }
        }
        //多线程 步长【0,10,20,30,40】修获取 集合上的位置各索引的值
        ArrayList arrayList = new ArrayList();
        for (int i = 0; i < 10000; i++) {
            arrayList.add(i);
        }
        int batch = 10;
        int size = arrayList.size();
        if (0 < size && size <= batch) {
            List list = arrayList.subList(0, size);
            threadPoolExecutor.submit(() -> {
                print0(list);
            });
        } else {
            int flag = size % batch == 0 ? size / batch : size / batch + 1;
            for (int i = 0; i < flag; i++) {
                List list;
                if (i == flag - 1) {
                    list = arrayList.subList(i * batch, arrayList.size());
                } else {
                    list = arrayList.subList(i * batch, (i + 1) * batch);
                }
                threadPoolExecutor.submit(() -> {
                    print0(list);
                });
            }
        }

 

下面这个是错误案例:

 

        //多线程并发修改
        ArrayList arrayList = new ArrayList();
        for (int i = 0; i < 100; i++) {
            arrayList.add(i);
        }
//        ArrayList:
//        System.arraycopy
//        System.arraycopy(elementData, 0, a, 0, size);


//        array.copy 【里面实现使用】浅复制  索引修改后对原数据造成影响

//        CopyOnWriteArrayList
//        es = Arrays.copyOf(es, es.length, Object[].class);

        CopyOnWriteArrayList copyOnWriteArrayList = new CopyOnWriteArrayList(arrayList);
        int batch = 10;
        int size = copyOnWriteArrayList.size();
        if (0 < size && size <= batch) {
            List list = copyOnWriteArrayList.subList(0, size);
            threadPoolExecutor.submit(() -> {
                print0(list);
            });
        } else {
            int flag = size % batch == 0 ? size / batch : size / batch + 1;
            for (int i = 0; i < flag; i++) {
                List list;
                if (i == flag - 1) {

                    list = copyOnWriteArrayList.subList(0, copyOnWriteArrayList.size());
                } else {

                    list = copyOnWriteArrayList.subList(0, batch);
                }

                threadPoolExecutor.submit(() -> {
                    //每次执行的都是0-9个元素
                    print0(list);
                    //并发修改异常
                    copyOnWriteArrayList.removeAll(list);
                });

            }
        }

 

        //迭代器不会报错  但是不能满足多线程批量处理
        CopyOnWriteArrayList copyOnWriteArrayList = new CopyOnWriteArrayList(arrayList);

            Iterator iterator = copyOnWriteArrayList.iterator();
            while (iterator.hasNext()){
                Object next = iterator.next();
                System.out.println(":::::::::"+next);
                copyOnWriteArrayList.remove(next);
            }
            System.out.println(":::"+JSON.toJSONString(copyOnWriteArrayList));

 

 

 

        //多线程并发修改
        ArrayList arrayList = new ArrayList();
        for (int i = 0; i < 100; i++) {
            arrayList.add(i);
        }
//        ArrayList:
//        System.arraycopy
//        System.arraycopy(elementData, 0, a, 0, size);


//        array.copy 【里面实现使用】浅复制  索引修改后对原数据造成影响【尤其是引用对象】,【建议复制一个新的集合,进行操作,这样两个集合就互不影响了】

        //对list操作,就不会影响list0[非引用对象]
//        ArrayList list=new ArrayList();
//        ArrayList list0=new ArrayList(list);
        
        
//        CopyOnWriteArrayList
//        es = Arrays.copyOf(es, es.length, Object[].class);

        CopyOnWriteArrayList copyOnWriteArrayList = new CopyOnWriteArrayList(arrayList);
        int batch = 10;
        int size = copyOnWriteArrayList.size();
        if (0 < size && size <= batch) {
            List list = copyOnWriteArrayList.subList(0, size);
            threadPoolExecutor.submit(() -> {
                print0(list);
            });
        } else {
            int flag = size % batch == 0 ? size / batch : size / batch + 1;
            for (int i = 0; i < flag; i++) {
                List list;
                if (i == flag - 1) {

                    list = copyOnWriteArrayList.subList(0, copyOnWriteArrayList.size());
                } else {

                    list = copyOnWriteArrayList.subList(0, batch);
                }

                threadPoolExecutor.submit(() -> {
                    //每次执行的都是0-9个元素
                    print0(list);
                    //并发修改异常
                    copyOnWriteArrayList.removeAll(list);
                });

            }
        }

 

标签:案例,int,arrayList,list,batch,copyOnWriteArrayList,并发,多线程,size
From: https://www.cnblogs.com/wangbiaohistory/p/17578522.html

相关文章

  • 好家伙!阿里最新版高并发系统设计涵盖了“三高”所有骚操作
    为啥都爱面高并发?首先为啥面试官喜欢问高并发、性能调优相关的问题,我想有两点原因:第一,本身互联网区别于传统软件行业的特点之一就是海量请求。传统软件公司每秒用户几个、几十个的请求很常见,但是互联网公司哪怕一个二线的App,后端接口请求一天几个亿也很正常。业务特点导致对候选人......
  • java并发编程(二)---上下文切换
    一、什么是上下文切换?  即使是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制。时间片是CPU分配给各个线程的时间,线程会在分配的时间片内执行任务,因为时间片非常短,所以CPU通过不停地切换线程执行,让我们感觉多个线程是同时执行的,时间片一般是几......
  • 深入理解 Serverless 计算的并发度
    作者:西流背景2019年Berkeley预测Serverless将取代Serverful计算[1],成为云计算的计算新范式。Serverless为应用程序开发提供了一种全新的系统架构,其凭借着弹性伸缩省事省心,按需付费更低成本、聚焦业务降低OPS这三大核心价值,将开发人员从繁重的手动资源管理和性能成本优......
  • 深入理解 Serverless 计算的并发度
    作者:西流背景2019年Berkeley预测Serverless将取代Serverful计算[1],成为云计算的计算新范式。Serverless为应用程序开发提供了一种全新的系统架构,其凭借着弹性伸缩省事省心,按需付费更低成本、聚焦业务降低OPS这三大核心价值,将开发人员从繁重的手动资源管理和性能成......
  • 130-vant案例-07-定义错误页面
    定义错误页面#1.配置路由#2.定义页面组件#3.访问不存在的路由会跳转错误页面1.定义路由index.jsimportNotFoundfrom'../views/NotFound.vue'//错误页面,优先级最低{path:'/:pathMatch(.*)*',///:占位符,后面可以随便写/:aa,/:bb;(.*)*:......
  • 性能测试并发用户数新的计算方法
    一件产品的完成,最重要的一环便是它的性能,好产品的性能必定是被人们所需要的。这篇文章详细阐述了产品性能需求的重要性,推荐想要了解性能要求的童鞋阅读。  我刚工作时,和政府部门做了个产品,功能就是个表单录入,录入完保存到系统。拿去给用户演示,一切很完美。  但是当......
  • 多线程
    1.Python通过两个标准库thread和threading提供对线程的支持。thread提供了低级别的、原始的线程以及一个简单的锁.Threading模块封装了一些常用的方法,初学者直接学这个模块就行了。2.Python中使用线程有两种方式:函数或者用类来包装线程对象3.threading.Thread里面几个参数介绍:c......
  • ARMA-GARCH-COPULA模型和金融时间序列案例|附代码数据
    原文链接: http://tecdat.cn/?p=3385最近我们被客户要求撰写关于ARMA-GARCH-COPULA的研究报告,包括一些图形和统计输出。从读取数据中获得各种模型的描述,包括一些图形和统计输出。 > oil = read.xlsx(temp,sheetName =“DATA”,dec =“,”)然后我们可以绘制这三个时间序列......
  • vue项目使用vue-virtual-scroll-list虚拟滚动超多千万条数据 cv可用案例
    当我们有大量数据需要显示在列表中时,传统的滚动列表会将所有数据渲染到DOM中,导致性能下降和内存占用增加。虚拟滚动列表通过仅渲染当前视窗内可见的一小部分数据,动态地根据滚动位置更新列表内容,从而实现更高效的列表渲染。vue-virtual-scroll-list是一个用于Vue.js的虚拟滚动......
  • 案例 1 , 旋转立方体
    <script>//创建场景varscene=newTHREE.Scene();//设置相机(视野,显示口的宽高比,近裁剪面,远裁剪面)varcamera=newTHREE.PerspectiveCamera(75,window.innerWidth/window.innerHeight,0.1,1000);//渲染器varrenderer=newTHREE.WebGLRen......