多线程情况下ArrayList 如何解决线性安全问题
问题:众所周知ArrayList是非线程安全的,在多线程的情况下,向list插入数据的时候,可能会造成数据丢失的情况.
并且一个线程在遍历List,另一个线程修改List,会报ConcurrentModificationException(并发修改异常)错误.
1.用老的Vector集合
2.使用Collections.synchronizedList。它会自动将我们的list方法进行改变,最后返回给我们一个加锁了List
protected static List<Object> arrayListSafe2 = Collections.synchronizedList(new ArrayList<Object>());
Collections.synchronizedList使用方法
List<String> list = Collections.synchronizedList(new ArrayList<String>()); list.add("1"); list.add("2"); list.add("3"); synchronized (list) { Iterator i = list.iterator(); // Must be in synchronized block while (i.hasNext()) { //foo(i.next()); System.out.println(i.next()); } }
为什么add()不需要synchronized,而遍历的时候需要加synchronized?
因为add()等方法的时候是加了synchronized关键字的,但是listIterator(),iterator()却没有加.所以在使用的时候需要加上synchronized.