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

举报
Lansonli 发表于 2022/10/01 00:12:29 2022/10/01
【摘要】 同步类容器应用一、应用问题比如ArrayList,HashMap,线程不安全,现在想把线程不安全的集合转换为线程安全的集合:public class Test01 { //这是main方法,程序的入口 public static void main(String[] args) { //ArrayList为案例:从线程不安全 转为线程安全: List...

同步类容器应用

一、应用问题

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

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


试试ArrayList的线程不安全:

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;
            }
        }
    }
}


结果:

二、利用同步类容器解决

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;
            }
        }
    }
}


结果:

源码解析:

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。