本博客知识点收录于:⭐️《JavaSE系列教程》⭐️
我们学习集合的时候发现集合存在由线程安全集合和线程不安全集合;线程安全效率低,安全性高;反之,线程不安全效率高,安全性低,线程不安全的集合有:Vector,Stack,Hashtable等;
线程安全集合中的方法大部分都加上了synchronized
关键字来保证线程的同步;
package com.dfbz.demo05;import java.util.ArrayList;/*** @author lscl* @version 1.0* @intro:*/
public class Demo01_集合的线程安全问题 {public static void main(String[] args) throws InterruptedException {ArrayList arr = new ArrayList<>();for (int j = 0; j < 20; ++j) {new Thread(() -> {for (int i = 0; i < 100; i++) {arr.add("1");try {// 然线程安全问题更加突出Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}}}).start();}}
}
运行代码,发现出现数组下标越界异常:
分析ArrayList源码:
elementData[size++]=e
这段代码时的那个线程,出现了elementData[10]=e,出现数组下标越界;Tips:HashMap同样会出现这个问题,将集合换成Vector或者Stack等线程安全集合可以解决这些问题;或者使用JDK提供的其他线程同步集合也可以解决这些问题;
上一篇:redis 未授权访问漏洞