2015-01-21 71 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