欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-08-21 11:35:50
同步类容器都是线程安全的,但某些情况下可能需要加锁来保护符合操作 复合操作:迭代(反复访问元素,遍历完容器中所有的元素);跳转(根据指定的顺序找到当前元素的下一个元素);条件运算 这些复合操作在多线程并发地修改容器时,可能会表现出意外的行为,最经典的便是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 }