在50个线程并发的情况下出现数组越界异常,经排查原因为某一个类为单例注入,但含有非线程安全属性。详细如下
1、异常现象:数据越界
java.lang.ArrayIndexOutOfBoundsException: 1
at org.apache.oro.text.regex.Perl5Matcher.__findFirst(Unknown Source)
at org.apache.oro.text.regex.Perl5Matcher.__interpret(Unknown Source)
at org.apache.oro.text.regex.Perl5Matcher.contains(Unknown Source)
at *.*.*.at.AtHelper.doFilter(AtHelper.java:68)
at *.*.*.at.AtHelper.render(AtHelper.java:121)
at *.*.*.comment.service.CommentService.render(CommentService.java:301)
at *.*.*.comment.service.CommentService.render(CommentService.java:290)
at *.*.*.comment.service.CommentService.listByAppIdAppItemId(CommentService.java:325)
at *.*.*.comment.CommentServiceTest$1.run(CommentServiceTest.java:42)
2、原因
*.*.*.at.AtHelper类为单例注入,
存在属性PatternMatcher matcher,初始化时赋值为matcher = new Perl5Matcher();
PatternMatcher为非线程安全,在多线程情况下导致内部数据越界
代码如下:
public class AtHelper {
// ……
private PatternMatcher matcher = null;
// ……
public AtHelper() throws MalformedPatternException{
// ……
matcher = new Perl5Matcher();
// ……
}
private List<String> doFilter(String content) {
// ……
while (matcher.contains(input, pattern) == true) {
mResult = matcher.getMatch();
String uid = StringUtil.substring(mResult.toString(), 1);
uids.add(uid);
}
return uids;
}
// ……
}
3、解决方法
去掉*.*.*.at.AtHelper类中属性PatternMatcher matcher
在需要的函数中定义变量PatternMatcher matcher = new Perl5Matcher();取代之
代码如下:
public class AtHelper {
// ……
// ……
public AtHelper() throws MalformedPatternException{
// ……
// ……
}
private List<String> doFilter(String content) {
// ……
PatternMatcher matcher = new Perl5Matcher();
while (matcher.contains(input, pattern) == true) {
mResult = matcher.getMatch();
String uid = StringUtil.substring(mResult.toString(), 1);
uids.add(uid);
}
return uids;
}
// ……
}
分享到:
相关推荐
单例模式是一种设计模式,它的核心思想是在整个应用程序中,保证一个类只有一个实例存在,并提供一个全局访问点。这样做的好处在于控制共享资源,优化性能,避免并发问题,以及简化对象间的交互。 **定义** 单例...
在多线程环境中,第一次检查实例是否已经创建,如果没有创建,则进行同步锁定,确保只有一个线程能够创建实例。 ```java public class Singleton { private volatile static Singleton instance; private ...
5. **多线程**:JAVA提供了强大的多线程支持,案例可能包含线程同步、线程池的使用,以及并发控制工具如Semaphore、CyclicBarrier等的应用。 6. **网络编程**:JAVA的Socket编程可用于实现客户端-服务器通信,案例...
5. **多线程**:Java的并发编程是其强大之处。案例将展示如何创建和管理线程,使用同步机制(如synchronized关键字、wait/notify机制)来避免线程安全问题。 6. **网络编程**:Java的Socket编程允许我们创建客户端...
1. **面向对象编程**:Java的基础是面向对象编程(OOP),它将现实世界中的问题抽象为类和对象。类是对象的模板,而对象则是类的实例。在案例中,你会看到如何定义类,如何使用继承、封装和多态等OOP原则。 2. **...
5. **多线程**:Java内置对多线程的支持,通过Thread类或Runnable接口实现。案例中可能会涉及线程同步、线程通信(如wait()、notify()、join()方法)以及线程池的使用。 6. **网络编程**:Java的Socket编程允许创建...
单例模式的实现需要注意线程安全问题,尤其是在多线程环境下,防止多个线程同时创建单例对象。此外,单例模式的生命周期较长,如果实例化的对象需要大量资源或具有状态,可能引发资源泄露或难以测试的问题。因此,...
18. **多线程**:学习如何使用Thread类、Task类以及Parallel命名空间来实现并发和并行计算。 19. **异步任务调度**:理解Task Parallel Library (TPL),以及如何使用TaskScheduler来管理任务执行。 20. **WPF...
1. **Java基础**:书中案例覆盖了Java的基础语法,如变量、数据类型、运算符、控制结构、类与对象、继承、多态、接口等。通过实践这些案例,读者可以巩固Java编程的基本功。 2. **面向对象编程**:作为面向对象语言...
6. **多线程**:Java提供了强大的多线程支持,如Thread类和Runnable接口。案例可能涵盖同步机制(synchronized、wait、notify、notifyAll)、线程池(ExecutorService)等。 7. **反射API**:反射是Java的一种动态...
6. **多线程**: - 线程的创建:通过Thread类或实现Runnable接口。 - 线程同步:synchronized关键字、wait/notify机制、ReentrantLock等。 - 线程池:ExecutorService和ThreadPoolExecutor的理解与使用。 7. **...
每个案例都可能是精心设计的,以解决特定的编程问题或实现特定的功能,比如数据结构与算法的应用、多线程处理、网络编程、数据库操作、图形用户界面(GUI)开发、Java Swing或JavaFX的应用、企业级Java(JEE)的实践...
5. **多线程**:Java提供了内置支持进行多线程编程,案例中可能有Thread类和Runnable接口的使用,以及同步机制如synchronized关键字、wait()、notify()方法的实践。 6. **网络编程**:Java的Socket编程可用于创建...
5. **多线程**:Java提供了丰富的多线程API,学习如何创建和管理线程,理解并发和同步的概念,可以提升程序的运行效率。 6. **异常处理**:良好的异常处理机制能保证程序在遇到错误时仍能正常运行,理解并熟练使用...
9. **设计模式**:Java案例中可能涵盖常见的设计模式,如单例模式、工厂模式、观察者模式、装饰器模式等,这些都是解决特定问题的有效方案。 10. **JVM内存管理**:理解Java虚拟机的内存区域(如堆、栈、方法区、...
- `Runnable`接口:实现多线程的一种方式,适合不需继承其他类的情况。 - 同步机制:`synchronized`关键字确保同一时间只有一个线程执行特定代码段,避免数据竞争。 7. **网络编程** - `Socket`编程:客户端和...
7. **多线程**:Java支持并发编程,案例可能涵盖线程的创建、同步(synchronized关键字,wait(),notify())和并发工具类(ExecutorService,Semaphore,CountDownLatch等)。 8. **设计模式**:单例、工厂、观察者...