工作中多线程总结

当两个线程并发地执行一个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.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值