package concurrent;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/*
* @author: wjf
* @version: 2016年3月28日 下午3:41:43
*/
public class TestConcurrentModification {
private static Lock lock=new ReentrantLock();
private static ArrayList<Integer> list=new ArrayList<Integer>();
public static void main(String[] arts){
list.add(2);
list.add(3);
list.add(4);
list.add(5);
Iterator<Integer> ite=list.iterator();
// while(ite.hasNext()){
// Integer temp=ite.next();
// if(temp==2){
// /*
// * 下面的 list.remove会报错:currentmodificationException ,具体原因可以分析源码
// * arraylist 的源码
// * 单线程环境中 使用 ite.remove 解决问题。
// 多线程环境可以使用 synchronized 或者 lock 解决iterator 并发访问的问题。
// */
//// list.remove(0);
// ite.remove();
// System.out.println(list.size());
// }
// }
Thread t1=new Thread(){
public void run(){
Iterator<Integer> ite=list.iterator();
// synchronized(TestConcurrentModification.class){
lock.lock();
while(ite.hasNext()){
System.out.println(Thread.currentThread().getName()+ite.next());
// ite.remove();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
lock.unlock();
}
// for(int i=0;i<list.size();i++){
// System.out.println("remove "+list.get(i));
// list.remove(i);
// }
// }
};
Thread t2=new Thread(){
public void run(){
Iterator<Integer> ite=list.iterator();
// synchronized(TestConcurrentModification.class){
lock.lock();
while(ite.hasNext()){
System.out.println(Thread.currentThread().getName()+" "+ite.next());
ite.remove();
}
// for(int i=0;i<list.size();i++){
// System.out.println("remove "+list.get(i));
// list.remove(i);
// }
lock.unlock();
}
// }
};
t1.start();
t2.start();
}
}