网站排版设布局,做费网站,软件工程师要求,公司建站方案文章目录 1、ArrayList集合线程安全问题分析2、解决方式一#xff1a;Vector或synchronizedList( )3、解决方式二#xff1a;CopyOnWriteArrayList 写时复制4、HashSet集合线程不安全的分析与解决5、HashMap集合线程不安全的分析与解决 1、ArrayList集合线程安全问题分析
对… 文章目录 1、ArrayList集合线程安全问题分析2、解决方式一Vector或synchronizedList( )3、解决方式二CopyOnWriteArrayList 写时复制4、HashSet集合线程不安全的分析与解决5、HashMap集合线程不安全的分析与解决 1、ArrayList集合线程安全问题分析
对List集合非线程安全的Demo代码
public class ArrayListDemo {public static void main(String[] args) {ListString list new ArrayList();//多个线程同时写入List集合for (int i 0; i 10; i) {new Thread(() - {//加元素list.add(UUID.randomUUID().toString().substring(0,8));//遍历输出集合System.out.println(list);},String.valueOf(i)).start();}}
}运行 ConcurrentModificationException异常是在多线程环境下当一个线程正在遍历集合而另一个线程对集合进行了修改操作时就会抛出这个异常。以ArrayList为例其add方法源码未加synchronized关键字 再点击报错详情进入抛出异常的方法 modCount即集合新增的次数是实际修改次数而expectedModCount是预期修改次数它是ArrayList的一个内部类Itr的成员变量调用iterator(获取迭代器时内部创建Itr对象此时modCount会赋值给expectedModCount 拿到迭代器对象要遍历集合时modCount已经赋值给expectedModCount而此时其他线程继续addmodCount1modCount和expectedModCount就不相等了。
2、解决方式一Vector或synchronizedList( )
List接口的另一个实现类Vector其add方法加了关键字使用它可解决线程安全问题但很古老了since1.2很少用了。 ListString list new Vector();
//重复代码略同样一种古老的解决方案可以用Collections的synchronizedList方法传入一个有线程安全问题的List如ArrayList:
ListString list Collections.synchronizedList(new ArrayList());3、解决方式二CopyOnWriteArrayList 写时复制
ListString list new CopyOnWriteArrayList();完整demo
public class ArrayListDemo {public static void main(String[] args) {ListString list new CopyOnWriteArrayList();//多个线程同时写入List集合for (int i 0; i 10; i) {new Thread(() - {//加元素list.add(UUID.randomUUID().toString().substring(0,8));//遍历输出集合System.out.println(list);},String.valueOf(i)).start();}}
}
原理是写时复制技术即
对这个List实现类的集合可以多线程并发读往集合中写的时候则只能独立写先复制一份原来的集合这个时候读还是读原来的然后往新集合里面写入新的内容写完后新旧合并再读时就读这个合并后的集合 看下源码再对照着理解写时复制 4、HashSet集合线程不安全的分析与解决
public class HashSetDemo {public static void main(String[] args) {SetString set new HashSet();for (int i 0; i 30; i) {new Thread(() - {//写入set.add(UUID.randomUUID().toString().substring(0,8));//读System.out.println(set);},String.valueOf(i)).start();}}
}运行 解决办法类比上面的List使用CopyOnWriteArraySet
SetString set new CopyOnWriteArraySet();5、HashMap集合线程不安全的分析与解决
public class HashSetDemo {public static void main(String[] args) {MapString,string map new HashMap();for (int i 0; i 30; i) {String key String.valueOf(i);new Thread(() - {//写入map.put(key,UUID.randomUUID().toString().substring(0,8));//读System.out.println(map);},String.valueOf(i)).start();}}
}解决办法类比List用ConcurrentHashMap
MapString,String map new ConcurrentHashMap();