2015-04-17 40 views
1

我對控制器對象有點困惑。因爲我知道默認情況下控制器是單身人士。 singleton如何工作,如下面的代碼,如果線程1執行到第9行並且empId爲12,並且線程2從線程1接收控制並且empId爲23並且完成整個方法的執行然後再次線程1執行empId的值是12還是23.Spring Controller singleton對象

而且我也注意到只有一個對象是爲UserServiceDao類創建的,所以如何在每個線程都有自己的實例的情況下在彈簧mvc中管理線程。

1 public class ActionController { 
2 
3 @Autowired 
4 UserServiceDao userServiceDao; 
5 
    int count = 1; 
6 
7 @RequestMapping("/dashboard.htm") 
8  public ModelAndView dashboard(HttpServletRequest request) { 
9   String empId = request.getParameter("empId"); 
10   UserProfile userProfile = userServiceDao.loadEmpById(empId); 
      System.out.println(count); 
      count++; 

11  } 
12 } 

    Thread first output: 1; 
    Thread second output : 2; 

謝謝。

回答

1

在控制器中,您沒有任何實例變量來保持任何控制器方法的調用狀態。所有變量都是方法(本地)變量,永遠不會在線程之間共享,因此不存在以多線程方式使用它的問題。

與使用servlet相同。

方法(本地)變量駐留在堆棧上,並且範圍僅限於方法的結尾。這裏empId是不在多個線程之間共享的局部變量。

以同樣的方式,UserServiceDao不應包含任何實例變量,以保持它的方法調用的狀態。

看看下面圖像:

enter image description here

讀更多Thread safety of instance methods that have local variables only

+0

詮釋計數會在線程之間共享。所以你的意思是說實例變量在Controller,Service或者Repository中的線程之間共享,你也可以共享圖像,因爲它是不可見的。 – pise

+0

當示波器進入畫面時,何時使用它?請參閱[tutorials point]下面的網址(http://www.tutorialspoint.com/spring/spring_bean_scopes.htm) – pise

0

控制器及其所有依賴項通常是無狀態的,所以併發訪問不是一個擔心。特別是讓你的DAO無國籍。