并发编程(一)------同步类容器
程序员文章站
2022-04-13 17:41:38
同步类容器都是线程安全的,但某些情况下可能需要加锁来保护符合操作 复合操作:迭代(反复访问元素,遍历完容器中所有的元素);跳转(根据指定的顺序找到当前元素的下一个元素);条件运算 这些复合操作在多线程并发地修改容器时,可能会表现出意外的行为,最经典的便是ConcurrentModificationE ......
- 同步类容器都是线程安全的,但某些情况下可能需要加锁来保护符合操作
- 复合操作:迭代(反复访问元素,遍历完容器中所有的元素);跳转(根据指定的顺序找到当前元素的下一个元素);条件运算
- 这些复合操作在多线程并发地修改容器时,可能会表现出意外的行为,最经典的便是concurrentmodificationexception,原因是当容器迭代的过程中,被并发的修改了内容,这是由于早期迭代器设计的时候并没有考虑并发修改的问
异常代码及解决方法
1 package com.bfxy.thread.cord.collection; 2 3 import java.util.arraylist; 4 import java.util.collection; 5 import java.util.collections; 6 import java.util.iterator; 7 import java.util.list; 8 import java.util.vector; 9 import java.util.concurrent.concurrenthashmap; 10 11 public class usesynccollection { 12 13 // 出现java.util.concurrentmodificationexception 增强for循环是多线程 不允许遍历时修改容器的元素 14 public collection<string> m1(vector<string> list) { 15 for (string temp : list) { 16 if ("3".equals(temp)) { 17 list.remove(temp); 18 } 19 } 20 return list; 21 22 } 23 // 出现java.util.concurrentmodificationexception iterator是多线程 不允许遍历时修改容器内元素 24 public collection<string> m2(vector<string> list) { 25 iterator<string> iterator = list.iterator(); 26 while (iterator.hasnext()) { 27 string temp = iterator.next(); 28 if ("3".equals(temp)) { 29 list.remove(temp); 30 } 31 } 32 return list; 33 34 } 35 //successful! 单线程 36 public collection<string> m3(vector<string> list) { 37 for (int i = 0; i < list.size(); i++) { 38 if ("3".equals(list.get(i))) { 39 list.remove(i); 40 } 41 } 42 return list; 43 } 44 45 46 public static void main(string[] args) { 47 48 vector v = new vector<>(); 49 v.add("1"); 50 v.add("2"); 51 v.add("3"); 52 usesynccollection test = new usesynccollection(); 53 collection<string> ret1 = test.m1(v); 54 system.err.println(ret1.tostring()); 55 56 // collection<string> ret2 = test.m2(v); 57 // system.err.println(ret2.tostring()); 58 59 // collection<string> ret3 = test.m3(v); 60 // system.err.println(ret3.tostring()); 61 62 63 // list<string> list = new arraylist<>(); 64 // collections.synchronizedcollection(list); 65 66 } 67 }
推荐阅读
-
Java日期时间API系列5-----Jdk7及以前的日期时间类TimeUnit在并发编程中的应用
-
Java并发编程之常用的辅助类详解
-
[Java 并发编程实战] 设计线程安全的类的三个方式(含代码)
-
[书籍翻译] 《JavaScript并发编程》第三章 使用Promises实现同步
-
[书籍翻译] 《JavaScript并发编程》第一章 JavaScript并发简介
-
一文了解Python并发编程的工程实现方法
-
Java并发编程,互斥同步和线程之间的协作
-
2020BAT一线互联网常考Java面试题:Spring+并发编程+JVM+设计模式+Redis
-
《Java并发编程实战》总结 - 第一部分 基础知识
-
《Java 编程思想》读书笔记之并发(一)