当两个线程并发地执行一个HashSet的时候,一个线程对HashSet做遍历(Iterator或者for循环,或者.clone()), 另一个线程对它.add或者.remove的时候,会抛出:java.util.ConcurrentModificationException.
而读的时候,hashSet.size(). hashSet.contains(XXX); 则不会发生异常。
解决办法是读的时候加读锁,写的时候加写锁。要注意读写锁必须来自同一个Lock:
Lock writeLock = UserListManager.getUserMsgLock(key).writeLock();
Lock readLock = UserListManager.getUserMsgLock(key).readLock();
同理,对于单线程,也不可以在遍历的时候修改。
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("a1");
list.add("a2");
list.add("a3");
for (String str : list) {
list.add(str + "1");
}
}
也会抛java.util.ConcurrentModificationException.
而读的时候,hashSet.size(). hashSet.contains(XXX); 则不会发生异常。
解决办法是读的时候加读锁,写的时候加写锁。要注意读写锁必须来自同一个Lock:
Lock writeLock = UserListManager.getUserMsgLock(key).writeLock();
Lock readLock = UserListManager.getUserMsgLock(key).readLock();
同理,对于单线程,也不可以在遍历的时候修改。
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("a1");
list.add("a2");
list.add("a3");
for (String str : list) {
list.add(str + "1");
}
}
也会抛java.util.ConcurrentModificationException.