当前位置: 首页 > Java > 正文

java set线程安全异常

关键字:
1 星2 星3 星4 星5 星 (暂无评分)
Loading ... Loading ...
baidu_share

在使用set 作为线程安全,使用Collections的synchronizedSet方法。

Set<String> resultSet=Collections.synchronizedSet(new HashSet<String>());

线程池高并发对resultSet操作,把结果放到Map中。

Map<String,Object> resultMap=new HashMap<String,Object>();
resultMap.put("total", Long.valueOf(resultSet.size()));				
resultMap.put("errorCount", resultSet.size());
resultMap.put("list", resultSet);

使用spring mvc,把结果显示在jsp页面上。结果出现了java.util.ConcurrentModificationException,错误位置出现在jsp遍历list。高并发修改线程安全set,并没有出现上述异常。

resultSet数量较小没有问题,较大就会把以上错误。把线程安全set再次转换为普通set,问题解决。

resultMap.put("list", new HashSet<String>(resultSet));

集合求交集方法:

Set<String> redisSet=new HashSet<String>(Arrays.asList(redisArray));
Set<String> ssdbSet=new HashSet<String>(Arrays.asList(ssdbArray));
//ssdbSet和redisSet交集
ssdbSet.retainAll(redisSet);

集合求并集方法:

Set<String> redisSet=new HashSet<String>(Arrays.asList(redisArray));
Set<String> ssdbSet=new HashSet<String>(Arrays.asList(ssdbArray));
//ssdbSet和redisSet并集
ssdbSet.addAll(redisSet);

集合求差集方法:

Set<String> redisSet=new HashSet<String>(Arrays.asList(redisArray));
Set<String> ssdbSet=new HashSet<String>(Arrays.asList(ssdbArray));
Set<String> redisTempSet=new HashSet<String>(redisSet);
Set<String> ssdbTempSet=new HashSet<String>(ssdbSet);
 
//redisSet对ssdbSet求差集
redisTempSet.removeAll(ssdbSet);
 
//ssdbSet对redisSet求差集
ssdbTempSet.removeAll(redisSet);

备注:set改用CopyOnWriteArraySet实现。

本文固定链接: http://www.chepoo.com/the-java-set-thread-safe-exception.html | IT技术精华网

java set线程安全异常:等您坐沙发呢!

发表评论