建设电影网站难吗,暖暖社区免费观看高清完整版,居然设计家官网,win7建设网站教程本博客知识点收录于#xff1a;⭐️《JavaSE系列教程》⭐️
1#xff09;线程安全与不安全集合
我们学习集合的时候发现集合存在由线程安全集合和线程不安全集合#xff1b;线程安全效率低#xff0c;安全性高#xff1b;反之#xff0c;线程不安全效率高#xff0c;安…本博客知识点收录于⭐️《JavaSE系列教程》⭐️
1线程安全与不安全集合
我们学习集合的时候发现集合存在由线程安全集合和线程不安全集合线程安全效率低安全性高反之线程不安全效率高安全性低线程不安全的集合有VectorStackHashtable等
查看Vector和Hashtable等源代码 线程安全集合中的方法大部分都加上了synchronized关键字来保证线程的同步
线程不安全集合 2线程不安全集合测试
数据覆盖问题
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 {ArrayListString 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源码
假设此时size为9size1并没有大于数组的默认长度10并没有造成数组的扩容等待代码将集合的9下标赋值后size还没来得及运算CPU的执行权就被其他的线程抢走了此时size仍旧为9但此时集合中已经存储了10个元素了等到其他线程来执行ensureCapacityInternal(91)—ensureCapacityInternal—ensureExplicitCapacity发现10-10还是小于0依旧不扩容代码执行elementData[size]e时还没执行线程执行权由回到了第一条线程size变为10然后线程执行器又变回执行elementData[size]e这段代码时的那个线程出现了elementData[10]e出现数组下标越界 TipsHashMap同样会出现这个问题将集合换成Vector或者Stack等线程安全集合可以解决这些问题或者使用JDK提供的其他线程同步集合也可以解决这些问题