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

​同步类容器应用

一、应用问题

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

结果:

源码解析:

正文完