大数据必学Java基础(六十一):同步类容器对比应用
        【摘要】 同步类容器应用一、应用问题比如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)