我有这门课:
public class A {
List l;
public String method() {
l = new ArrayList();
try {
.....
l.add(new Integer(5));
.....
}
catch (Exception e) {
......
}
finally {
if(l!=null)
l=null;
}
我有许多用户运行相同的模板(gtmpl),其中包含:
A a = new A();
a.method();
问题在于用户在另一个用户执行 l=null;
之后直接到达 l.add(new Integer(5));
。我收到一个 NullPointerException
。我不明白为什么?我以为每个线程都会分配一个列表?怎么了?
最佳答案
您是否为每个线程创建一个新的A
实例?如果线程共享 A
的实例,则 List
类型的字段/实例变量将使代码不线程安全。
理解线程安全 (IMO) 的最佳方法之一是考虑 J2EE 环境中提供的示例 Servlet。一个应用程序只会创建一个 servlet 实例,而同一个 servlet 实例会处理多个请求(每个请求都链接到一个线程),因此,如果将实例变量放入 servlet 中,必然会出现线程安全问题。
给this article阅读。
关于java - "NullPointerException"当许多引用访问我的方法时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17165699/