java面试-集合类不安全问题及解决方案
一、List
1、代码演示
public class ArrayListNotSafeDemo {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        for (int i = 1; i <= 30; i++) {
            new Thread(() -> {
                //Constructs an empty list with an initial capacity of ten.
                list.add(UUID.randomUUID().toString().substring(0, 8));
                System.out.println(list);
            }, String.valueOf(i)).start();
        }
    }
}
2、故障现象
java.util.ConcurrentModificationException
3、导致原因
一个线程正在写,另一线程过来抢夺,导致数据不一致,即并发修改导致的异常
4、解决方案
- new Vector<>()
 - Collections.synchronizedList()
 - new CopyOnWriteArrayList<>()
 
在读多写少的时候推荐使用 CopeOnWriteArrayList 这个类
写时复制,读写分离的思想 好处:读操作完全无锁
使用场景 :写操作非常少的场合,能容忍读写的短暂不一致。
CopyOnWriteArrayList迭代器是只读的,不支持增删改。
5、 CopyOnWriteArrayList源码解读:
    public boolean add(E e) {
        final ReentrantLock lock = this.lock;
        lock.lock();
        try {
            Object[] elements = getArray();
            int len = elements.length;
            Object[] newElements = Arrays.copyOf(elements, len + 1);
            newElements[len] = e;
            setArray(newElements);
            return true;
        } finally {
            lock.unlock();
        }
    }
二、Set
1、代码演示:
public class HashSetNotSafeDemo {
    public static void main(String[] args) {
        Set<String> list = new HashSet<>();
        for (int i = 1; i <= 30; i++) {
            new Thread(() -> {
                list.add(UUID.randomUUID().toString().substring(0, 8));
                System.out.println(list);
            }, String.valueOf(i)).start();
        }
    }
}
2、解决方案:
- Collections.synchronizedSet()
 - new CopyOnWriteArraySet<>()
 
3、CopyOnWriteArraySet底层源码:
底层使用CopyOnWriteArrayList
    public CopyOnWriteArraySet() {
        al = new CopyOnWriteArrayList<E>();
    }  
4、HashSet底层源码
HashSet的key是你add()的值,value是一个叫PRESENT Object类型的常量,即HashSet只关心key
    public HashSet() {
        map = new HashMap<>();
    }
    private static final Object PRESENT = new Object();
    public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }  
三、Map
1、代码演示:
public class HashMapNotSafeDemo {
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<>();
        for (int i = 1; i <= 30; i++) {
            new Thread(() -> {
                map.put(Thread.currentThread().getName(), UUID.randomUUID().toString().substring(0, 8));
                System.out.println(map);
            }, String.valueOf(i)).start();
        }
    }
}
2、解决方案
- Collections.synchronizedMap()
 - new ConcurrentHashMap<>();
 
java面试-集合类不安全问题及解决方案的更多相关文章
- Java 面试宝典-2017
		
http://www.cnblogs.com/nelson-hu/p/7190163.html Java面试宝典-2017 Java面试宝典2017版 一. Java基础部分........... ...
 - Java面试宝典-2017
		
Java面试宝典2017版 一. Java基础部分........................................................................... ...
 - Java面试宝典2018
		
转 Java面试宝典2018 一. Java基础部分…………………………………………………………………………………….. 7 1.一个“.java”源文件中是否可以包括多个类(不是内部类)?有什么限制 ...
 - 【面试题】2018年最全Java面试通关秘籍汇总集!
		
[面试题]2018年最全Java面试通关秘籍汇总集!(转载于互联网) 前几天在交流群里有些小伙伴问面试相关的试题,当时给出了一些问题,苦于打字太累就没写下去了,但觉得这是一个很不负责任的表现,于是 ...
 - java面试宝典2019(好东西先留着)
		
java面试宝典2019 1.meta标签的作用是什么 2.ReenTrantLock可重入锁(和synchronized的区别)总结 3.Spring中的自动装配有哪些限制? 4.什么是可变参数? ...
 - Java面试宝典2017
		
JAVA面试.笔试题(2017版) 欲想成功,必须用功! 目录 一. HTML&CSS部分................ ...
 - 转:最近5年133个Java面试问题列表
		
最近5年133个Java面试问题列表 Java 面试随着时间的改变而改变.在过去的日子里,当你知道 String 和 StringBuilder 的区别就能让你直接进入第二轮面试,但是现在问题变得越来 ...
 - java面试宝典(蓝桥学院)
		
Java面试宝典(蓝桥学院) 回答技巧 这套面试题主要目的是帮助那些还没有java软件开发实际工作经验,而正在努力寻找java软件开发工作的学生在笔试/面试时更好地赢得好的结果.由于这套试题涉及的范围 ...
 - java面试和笔试大全                                                    分类:            面试             2015-07-10 22:07    10人阅读    评论(0)    收藏
		
2.String是最基本的数据类型吗? 基本数据类型包括byte.int.char.long.float.double.boolean和short. java.lang.String类是final类型 ...
 
随机推荐
- ES-Next classes static properties
			
ES-Next classes static properties https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ ...
 - 修改vs模板抬头\Common7\IDE\ItemTemplates\CSharp\Code\2052\Class
			
//************************************************************************************************** ...
 - Golang 实现 Redis(9): 使用GeoHash 搜索附近的人
			
本文是使用 golang 实现 redis 系列的第九篇,主要介绍如何使用 GeoHash 实现搜索附近的人. 搜索附近的POI是一个非常常见的功能,它的技术难点在于地理位置是二维的(经纬度)而我们常 ...
 - 阿里云CentOS8.0服务器配置Django3.0+Python 3.7 环境
			
---恢复内容开始--- 1. 下载并安装python # 安装Python3.7.6 wget https://www.python.org/ftp/python/3.7.6/Python-3.7. ...
 - redis.conf 配置说明
			
redis.conf 配置项说明如下: 1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程 daemonize no 2. 当Redis以守护进程方式运行时,R ...
 - MVC base64加密的文件,前端下载
			
后端代码: public FileResult OutPutFile(string base64file,string filename) { buffer = Convert.FromBase64 ...
 - JavaWeb随笔整理
			
JavaWeb随笔整理 为方便阅读,故整理了相关学习笔记 前端相关 HTML CSS JavaScript BootStrap 数据库相关 MySQL基础 MySQL表的约束和数据库设计 MySQL多 ...
 - cve-2019-2725 反序列化远程代码执行
			
描述:部分版本WebLogic中默认包含的wls9_async_response包,为WebLogic Server提供异步通讯服务.由于该WAR包在反序列化处理输入信息时存在缺陷,攻击者可以发送精心 ...
 - 从零学脚手架(四)---babel
			
如果此篇对您有所帮助,在此求一个star.项目地址: OrcasTeam/my-cli 接下来介绍一个打包编译过程中一个极为重要的工具--babel. ES6的枷锁 细心的朋友可以知道,在之前打包编译 ...
 - css整理之-----------技巧、黑魔法
			
css 看起来比较简单,但是要想做的好也不是那么容易,我们在平时开发中,主要用css 来美化我们的html结构,所有我觉得css 还是挺重要的,这里记录整理一些关于css 的技巧以及容易忘记的知识点. ...