线程并发安全导致内存溢出
整个网站访问不了,后台日志内存溢出,提出了个致命单,找到问题后,整理成了案例,供培训使用。 原因: 流量统计FlowUtil类使用两个static的List来装载流量信息实体bean。 用户每次点击都会将一个产生一个bean并加入到第一个List1中,当List1里的bean到一定数量时(可在后台配置缓存大小),List1将所有的实体bean复制到 List2中,然后List1清空继续接收新的bean,这时List2开启一个新线程异步去将bean插入数据库,然后清空。 Method add(bean){ list1 .add(bean); if ( list1 .size() >= cacheSize) { List2 .addAll( list1 ); list1 .clear(); new Thread({ try { insertDB(list2); list2.clear(); } catch (ApplicationException e) { } }).start(); } } 整个操作没有做同步锁定,如果并发量大,List2还没完成插入数据库的操作,List1又将新接收的bean全部加入到List2中,又发起一个新线程去插数据库,如果这个线程跑在之前那个线程前,因为这时List2之前的bean是没有被清空的,再插入数据库的时候,id就会重复,就会抛出违反唯一性约束异常