首页 > 编程语言 > 详细

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

时间:2020-05-07 02:37:27      阅读:122      评论:0      收藏:0      [点我收藏+]

一、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();
        }

    }
}

 

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

原文:https://www.cnblogs.com/jenne-blog/p/12839719.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!