前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >大数据必学Java基础(六十一):同步类容器对比应用

大数据必学Java基础(六十一):同步类容器对比应用

原创
作者头像
Lansonli
发布2022-10-01 00:11:30
1740
发布2022-10-01 00:11:30
举报
文章被收录于专栏:Lansonli技术博客

​同步类容器应用

一、应用问题

比如ArrayList,HashMap,线程不安全,现在想把线程不安全的集合转换为线程安全的集合:

代码语言:javascript
复制
public class Test01 {
    //这是main方法,程序的入口
    public static void main(String[] args) {
        //ArrayList为案例:从线程不安全  转为线程安全:
        List list = Collections.synchronizedList(new ArrayList());
    }
}

试试ArrayList的线程不安全:

代码语言:javascript
复制
package com.lanson.test02;

import java.util.ArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @author : Lansonli
 */
public class Demo {
    //这是main方法,程序的入口
    public static void main(String[] args) {
        //创建一个ArrayList集合:
        ArrayList list = new ArrayList();

        //创建一个线程池:线程池定长100
        ExecutorService es = Executors.newFixedThreadPool(100);

        //并发向集合中添加10000个数据:
        for (int i = 0; i < 10000; i++) {
            //每个线程处理任务:run方法中的内容就是线程单元,任务,实际线程执行的部分
            es.execute(new Runnable() {
                @Override
                public void run() {
                    list.add("aaa");
                }
            });
        }

        //关闭线程池:
        es.shutdown();

        //监控线程是否执行完毕:
        while(true){
            //线程都执行完以后返回true
            if(es.isTerminated()){
                System.out.println("所有的子线程都执行完毕了!");
                //执行完毕以后看一下集合中元素的数量:
                System.out.println(list.size());
                if(list.size() == 10000){
                    System.out.println("线程安全!");
                }else{
                    System.out.println("线程不安全!");
                }

                //线程执行完以后,while循环可以停止:
                break;
            }
        }
    }
}

结果:

二、利用同步类容器解决

代码语言:javascript
复制
package com.lanson.test02;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @author : Lansonli
 */
public class Demo {
    //这是main方法,程序的入口
    public static void main(String[] args) {
        //创建一个ArrayList集合:
        ArrayList oldlist = new ArrayList();
        List list = Collections.synchronizedList(oldlist);

        //创建一个线程池:线程池定长100
        ExecutorService es = Executors.newFixedThreadPool(100);

        //并发向集合中添加10000个数据:
        for (int i = 0; i < 10000; i++) {
            //每个线程处理任务:run方法中的内容就是线程单元,任务,实际线程执行的部分
            es.execute(new Runnable() {
                @Override
                public void run() {
                    list.add("aaa");
                }
            });
        }

        //关闭线程池:
        es.shutdown();

        //监控线程是否执行完毕:
        while(true){
            //线程都执行完以后返回true
            if(es.isTerminated()){
                System.out.println("所有的子线程都执行完毕了!");
                //执行完毕以后看一下集合中元素的数量:
                System.out.println(list.size());
                if(list.size() == 10000){
                    System.out.println("线程安全!");
                }else{
                    System.out.println("线程不安全!");
                }

                //线程执行完以后,while循环可以停止:
                break;
            }
        }
    }
}

结果:

源码解析:

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ​同步类容器应用
    • 一、应用问题
      • 二、利用同步类容器解决
      相关产品与服务
      容器服务
      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档