2015-01-21 65 views
0

使用Ajax请求从.jsp页面访问ResourceMapping“过滤器”。这段代码是否在Spring应用程序中是安全的?

我的理解是,Spring将创建一个新的执行线程,每次访问资源“过滤器”时都会执行 。由于FilterItems是一个Spring @Component bean ,因此它是一个singleton,然后多个线程(通过调用资源“filter”来访问)将访问同一个实例。 FilterItems的一个新实例被实例化,每次调用“filter” 资源,因为每个实例在线程间共享,那么这是线程安全的?

是FilterItems.filter1 &的调用FilterItems.filter2 线程?

@Controller 
@RequestMapping("VIEW") 
public class MyController { 
@ResourceMapping(value = "filter") 
    public void filter(){ 

     FilterItems t = new FilterItems(); 
     LinkedList<MyObj> l = new LinkedList<MyObj>(); 
     l.add(new MyObj("1")); 
     l.add(new MyObj("2")); 

     System.out.println("size is : " + l.size()); 

     t.filterItem1(l);  
     System.out.println("size is : " + l.size()); 

     t.filterItem2(l); 
     System.out.println("size is : " + l.size()); 
    } 
} 

***************************************************************************** 

import java.util.Iterator; 
import java.util.LinkedList; 

@Component 
public class FilterItems { 

    public void filterItem1(LinkedList<MyObj> l) { 

     Iterator<MyObj> iter = l.iterator(); 
     while (iter.hasNext()) { 
      MyObj myObj = iter.next(); 

      if (myObj.param.equalsIgnoreCase("1")) { 
       iter.remove(); 
      } 
     } 
    } 

    public void filterItem2(LinkedList<MyObj> l) { 

     Iterator<MyObj> iter = l.iterator(); 
     while (iter.hasNext()) { 
      MyObj myObj = iter.next(); 

      if (myObj.param.equalsIgnoreCase("2")) { 
       iter.remove(); 
      } 
     } 
    } 

    private static class MyObj { 

     public final String param; 

     public MyObj(String param) { 
      this.param = param; 
     } 
    } 

} 

回答

2

控制器代码对共享可变数据没有依赖关系,它只处理单个我的本地数据thod调用。这意味着代码是线程安全的。

但是,还不清楚MyController如何设法调用FilterItems上的私有方法,或者如何实例化外部私有静态类MyObj

+0

谢谢,我改变了公众的可见性,而不是私人的方法调用 – 2015-01-21 11:45:39

0

它是差不多线程安全为差不多所有的数据都存储在本地变量中并作为参数传递。

唯一可能的例外是MyObjparam字段,它应该是final以保证在创建对象后每个人都能看到相同的值。

JLS

的对象被认为是完全初始化时其 构造饰面。在该对象完全初始化后,只能看到对象 的引用的线程保证 能够查看该对象的最终 字段的正确初始化值。

但只要MyObj类保持private,并没有其他人都不可能实例化它们,这不会是一个问题。

+0

对于这个问题,他使用的'LinkedList'也是可变的,但是这不会在他的特定代码中造成麻烦。 – 2015-01-21 11:39:49

+0

@MarkoTopolnik是的,它只被创建为局部变量并作为参数传递,因此它不会被任何其他线程看到。 – biziclop 2015-01-21 11:40:55

+0

这与“MyObj”实例有什么不同?我错过了明显的东西吗? – 2015-01-21 11:41:29