2013-11-25 3 views
2

나는이 질문에 대해 웹 사이트를 살펴 보았지만 걱정할 필요가 없다.스프링 MVC : 다중 사용자 친화적으로 만들기

String someVariable; 
@RequestMapping(value = "/home",method = RequestMethod.GET) 
public String home(Model model) 
{ 
     MyClass ob = new MyClass(); 

     // using 'someVariable' 

     int r = ob.method1(); 
     //......... 
     //........ 
     return "something" 
} 

MyClass에

public class MyClass{ 
     int i=0; 
     public int method1(){ 
     // some operations on i 
     return i; 
     } 
} 

윌 다중 사용자 환경에서이 스프링 MVC 잘 작동? MyClass은 다중 사용자 환경에서 스레드 안전합니까?

MVC 응용 프로그램을 여러 사용자가 사용할 수 있도록 잘 만들고 싶습니다. 이것에 대해 간단한 설명을 얻을 수 있습니까?

+0

아래 답변 중 하나를 수락하지 않았습니다. 어떤 이유? –

답변

2

MyClass은 스레드로부터 안전하지 않습니다. 하지만 컨트롤러에서 사용되는 방식은 스레드로부터 안전합니다. 당신이 당신의 home 방법에 MyClass의 인스턴스를 생성 한대로 : 실행

public String home(Model model) 
{ 
     MyClass ob = new MyClass(); 

     // using 'someVariable' 

     int r = ob.method1(); 
     //......... 
     //........ 
     return "something" 
} 

모든 스레드는 MyClass의 별도의 인스턴스를 얻을 것이다. 따라서 하나의 응용 프로그램 스레드가 자신의 MyClass 인스턴스에서 변경 한 사항은 다른 응용 프로그램 스레드에서 사용할 수있는 다른 인스턴스에 영향을 미치지 않습니다.

그러나 스프링 컨트롤러의 기본 범위를 사용하는 경우 someVariable을 쓰레드 안전하지 않습니다. 기본 범위는 싱글 톤 범위입니다. 여기에는 사용 가능한 컨트롤러 인스턴스가 하나만 있고 모든 응용 프로그램 스레드에서 동일한 someVariable을 사용할 수 있습니다. 따라서 컨트롤러에 가변 인스턴스 변수를 사용하는 것은 바람직하지 않습니다. String이 불변 인 경우에도 한 사용자가 새 값을 설정하면 someVariable 하나만 사용할 수 있으므로 다른 사용자가 동일한 값을 사용할 수 있습니다.

+0

그래서'someVariable'을 보호하는 방법은 무엇입니까? 컨트롤러 내부에서 MyClass를 초기화하는 것이 좋습니까? – manish

+1

'someVariable'이 초기화 후에 변경되지 않으면'final'이라고 선언하면됩니다. 그리고 만약 다른 쓰레드에 다른 값을 가지면,'home' 메소드에 대한 로컬 메소드로 선언하는 것이 더 좋습니다. MyClass를 불변이고 모든 응용 프로그램 스레드에 대해 동일하면 인스턴스 변수로 선언하십시오. 그렇지 않으면,'MyClass'를 사용하는 방법은 쓰레드에 안전합니다. –

2

네, 괜찮습니다. 각 요청은 별도의 스레드에서 제공됩니다. 그래서 모든 스레드는 MyClass라는 자체 인스턴스를 갖게됩니다. MyClass를 싱글 톤 범위의 Spring bean으로 만들거나 MyClass 객체가 데이터베이스에 액세스하는 경우 (공유 리소스의 경우 모두)에는 문제가 발생할 수 있습니다. 이 경우 스레드를 동기화해야합니다.

+0

'someVariable'은 어떻습니까? 스레드 안전합니까? – manish

+0

someVariable이 Controller 속성이지만 컨트롤러가 Singleton 스코프가있는 Spring bean이면 예, 제대로 작동하려면 동기화가 필요합니다. – mvb13

+0

데이터베이스의 경우 'MyClass'에서 DB와 일치하지 않는 데이터가있을 수 있지만'MyClass' (및 변수)에 대한 액세스는 안전 할 것입니다. 당신은 Synchronizing, 자주 사용되는 메소드/클래스를 어떻게 동기화 할 것인가에 대해 이야기하고 있습니다. 내가 'Synchronized'키워드를 사용한다면 자원을 소비하지 않을 것입니까? – manish