当前位置: 移动技术网 > IT编程>软件设计>架构 > 并发编程(一)------同步类容器

并发编程(一)------同步类容器

2018年12月26日  | 移动技术网IT编程  | 我要评论
  • 同步类容器都是线程安全的,但某些情况下可能需要加锁来保护符合操作
  • 复合操作:迭代(反复访问元素,遍历完容器中所有的元素);跳转(根据指定的顺序找到当前元素的下一个元素);条件运算
  • 这些复合操作在多线程并发地修改容器时,可能会表现出意外的行为,最经典的便是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 }

 

        

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网