多线程安全问题案例1 单例注入的类中含非线程安全属性

在50个线程并发的情况下出现数组越界异常,经排查原因为某一个类为单例注入,但含有非线程安全属性。详细如下

 

1、异常现象:数据越界

Xml代码   收藏代码
  1. java.lang.ArrayIndexOutOfBoundsException: 1  
  2.    at org.apache.oro.text.regex.Perl5Matcher.__findFirst(Unknown Source)  
  3.    at org.apache.oro.text.regex.Perl5Matcher.__interpret(Unknown Source)  
  4.    at org.apache.oro.text.regex.Perl5Matcher.contains(Unknown Source)  
  5.    at *.*.*.at.AtHelper.doFilter(AtHelper.java:68)  
  6.    at *.*.*.at.AtHelper.render(AtHelper.java:121)  
  7.    at *.*.*.comment.service.CommentService.render(CommentService.java:301)  
  8.    at *.*.*.comment.service.CommentService.render(CommentService.java:290)  
  9.    at *.*.*.comment.service.CommentService.listByAppIdAppItemId(CommentService.java:325)  
  10.    at *.*.*.comment.CommentServiceTest$1.run(CommentServiceTest.java:42)  

 

 

2、原因

  *.*.*.at.AtHelper类为单例注入

  存在属性PatternMatcher matcher,初始化时赋值为matcher = new Perl5Matcher();

  PatternMatcher为非线程安全,在多线程情况下导致内部数据越界

代码如下:

Java代码   收藏代码
  1. public class AtHelper {  
  2.   
  3. //    ……  
  4.     private PatternMatcher  matcher  = null;  
  5. //    ……  
  6.       
  7.     public AtHelper() throws MalformedPatternException{  
  8. //        ……  
  9.         matcher = new Perl5Matcher();  
  10. //        ……  
  11.     }  
  12.       
  13.     private List<String> doFilter(String content) {  
  14. //        ……  
  15.         while (matcher.contains(input, pattern) == true) {  
  16.             mResult = matcher.getMatch();  
  17.             String uid = StringUtil.substring(mResult.toString(), 1);  
  18.             uids.add(uid);  
  19.         }  
  20.         return uids;  
  21.     }  
  22. //    ……  
  23. }  
 

 

3、解决方法

去掉*.*.*.at.AtHelper类中属性PatternMatcher matcher

在需要的函数中定义变量PatternMatcher matcher = new Perl5Matcher();取代之

代码如下:

Java代码   收藏代码
  1. public class AtHelper {  
  2.   
  3. //    ……  
  4. //    ……  
  5.       
  6.     public AtHelper() throws MalformedPatternException{  
  7. //        ……  
  8. //        ……  
  9.     }  
  10.       
  11.     private List<String> doFilter(String content) {  
  12. //        ……  
  13.         PatternMatcher  matcher  = new Perl5Matcher();  
  14.         while (matcher.contains(input, pattern) == true) {  
  15.             mResult = matcher.getMatch();  
  16.             String uid = StringUtil.substring(mResult.toString(), 1);  
  17.             uids.add(uid);  
  18.         }  
  19.         return uids;  
  20.     }  
  21. //    ……  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值