1

我有这门课:

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.add(new Integer(5));在另一个已经执行后直接 到达的情况l=null;。我得到一个NullPointerException. 我不明白为什么?我以为每个线程都会被分配一个列表?怎么了?

4

2 回答 2

2

A您是否为每个线程创建一个新实例?如果线程共享一个实例,A那么类型的字段/实例变量List将使代码不是线程安全的。

了解线程安全 (IMO) 的最佳方法之一是考虑 J2EE 环境中提供的示例 Servlet。只为应用程序创建一个 servlet 实例,并且同一个 servlet 实例处理多个请求(每个请求都链接到一个线程),因此如果将实例变量放在 servlet 中,您必然会遇到线程安全问题。

阅读这篇文章

于 2013-06-18T09:51:49.653 回答
0

1)如果每个线程都创建一个类 A 的新实例,那么,是的,您将有不同的列表。

2)如果每个线程都使用相同的 A 实例,但每个线程都调用,那么您每次method都将重新初始化ll = new ArrayList();

如果您正在执行 (2) 并且不希望这种行为,那么您可以编写final List l;、在构造函数中创建它,或者编写final List l = new ArrayList(). 这样做意味着如果您尝试重新创建l有助于提高程序稳定性的编译错误;即,将来维护您的代码的人不会落入同样的陷阱。

于 2013-06-18T09:56:49.760 回答