JUC---07解决集合线程不安全

一、ArrayList是线程不安全的,可以使用以下操作解决:

  1.使用相同功能的集合类替换,比如Vector集合是线程安全的,他们实现的接口都是一样的,但是Vector类是在jdk1.0出现的,不推荐使用

  

 

 

   2.使用 java.util.Collections类里面的静态方法synchronizedXXX(xxx),把不安全的集合当参数放进去。

  

  3.使用java.util.concurrent.CopyOnWriteArrayList或java.util.concurrent.CopyOnWriteArraySet

  

 

二、从上面第二个知道Map与Set都是线程不安全的,其中Map的第三个解决方法是 java.util.concurrent.ConcurrentHashMap

三、代码实现

  

package com.jenne.mydemo;

import org.junit.jupiter.api.Test;

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CopyOnWriteArraySet;

public class TestCollection {
    @Test
    public void testList() {
       /* //可能会出现java.util.ConcurrentModificationException
        List<String> list = new ArrayList<>();
        for (int i = 1; i <= 8; i++) {
            new Thread(() -> {
                list.add(Thread.currentThread().getName()+"--->测试");
                System.out.println(list);
            }).start();
        }*/


        /*List<String> list = new Vector<>();//不推荐
        for (int i = 1; i <= 6; i++) {
            new Thread(() -> {
                list.add(Thread.currentThread().getName()+"--->测试");
                System.out.println(list);
            }).start();
        }*/


        /*List<String> list = Collections.synchronizedList(new ArrayList<>());//不推荐
        for (int i = 1; i <= 6; i++) {
            new Thread(() -> {
                list.add(Thread.currentThread().getName()+"--->测试");
                System.out.println(list);
            }).start();
        }*/

        List<String> list = new CopyOnWriteArrayList<>();//推荐使用
        for (int i = 1; i <= 6; i++) {
            new Thread(() -> {
                list.add(Thread.currentThread().getName() + "--->测试");
                System.out.println(list);
            }).start();
        }
    }

    @Test
    public void testSet() {
        /*//java.util.ConcurrentModificationException
        Set<String> set = new HashSet<>();
        for (int i = 1; i <= 16; i++) {
            new Thread(() -> {
                set.add(Thread.currentThread().getName()+"--->测试");
                System.out.println(set);
            }).start();
        }*/


       /* Set<String> set = Collections.synchronizedSet(new HashSet<>());//不推荐
        for (int i = 1; i <= 16; i++) {
            new Thread(() -> {
                set.add(Thread.currentThread().getName()+"--->测试");
                System.out.println(set);
            }).start();
        }*/


        Set<String> set = new CopyOnWriteArraySet<>();//推荐使用
        for (int i = 1; i <= 16; i++) {
            new Thread(() -> {
                set.add(Thread.currentThread().getName() + "--->测试");
                System.out.println(set);
            }).start();
        }
    }

    @Test
    public void testMap() {
        /*//java.util.ConcurrentModificationException
        Map<String,String> map = new HashMap<>();
        for (int i = 1; i <= 16; i++) {
            new Thread(() -> {
                map.put(Thread.currentThread().getName(),"--->测试");
                System.out.println(map);
            }).start();
        }*/

        /*Map<String, String> map = Collections.synchronizedMap(new HashMap<>());//不推荐
        for (int i = 1; i <= 16; i++) {
            new Thread(() -> {
                map.put(Thread.currentThread().getName(), "--->测试");
                System.out.println(map);
            }).start();
        }*/

        Map<String,String> map = new ConcurrentHashMap<>();//推荐使用
        for (int i = 1; i <= 16; i++) {
            new Thread(() -> {
                map.put(Thread.currentThread().getName(),"--->测试");
                System.out.println(map);
            }).start();
        }

    }
}

 

posted @ 2020-05-06 22:52  Jenne  阅读(165)  评论(0)    收藏  举报