2011-01-06 4 views
6

싱글 톤 범위에서 서비스를 정의하는 경우 둘 이상의 사용자가 동시에 액세스하려고하면 (즉, 컨트롤러에 종속성이 주입 된 경우) 어떻게 될까요? ? 충돌이 발생해야합니까? 또는 IoC 컨테이너가 첫 번째 호출이 완료 될 때까지 이후 호출을 보류합니까? 그렇다면 대용량 애플리케이션의 성능이 저하 될 것입니다. 어떤 사람이 나에게 정확한 답을 줄 수 있니?동시에 액세스 할 때 Singleton 인스턴스가 여러 번 액세스하는 경우

내가 기억할 수있는 것처럼, 싱글 톤이 아닌 경우 IoC 컨테이너는 요청 수를 기반으로 거의 인스턴스를 풀링하지 않습니다. 어떤 사람이 그것을 확인할 수 있습니까?

답변

12

둘 이상의 사용자가 동시에 액세스하려고하면 (즉, 컨트롤러에 종속되는 종속성) 동시에 발생하는 상황은 무엇입니까?

싱글 톤 Bean은 여러 번 동시에 액세스 할 수 있습니다. 그렇기 때문에 항상 스레드로부터 안전해야합니다.

충돌이 발생해야합니까?

만 당신이 안전 스레드

또는 첫 번째 마무리 될 때까지 나중에 전화를 보유 할 IoC 컨테이너 만들기 위해 실패 할 경우? 내가 기억으로는 싱글이 아닌 경우

아니, 즉,


BTW 끔찍한 것, IoC 컨테이너는 요청의 수에 따라 몇 가지 인스턴스를 풀 것입니다. 어떤 사람이 그것을 확인할 수 있습니까?

봄 (see Bean Scopes reference를) 다음과 같은 범위를 가지고 :

  • singleton
  • prototype (모든 주입을위한 새로운 인스턴스)
  • session (하나의 인스턴스 (하나의 인스턴스 만은 응용 프로그램 당 관리) HTTP 세션 당, 스프링 MVC에서만)
  • request (HTTP 요청 당 하나의 인스턴스, 스프링 MVC에서만)
  • global session (만 포틀릿 기반의 스프링 MVC 글로벌 HTTP 세션 당 하나 개의 인스턴스) 또한

: 봄 3.0로

, 스레드 범위는 사용할 수 있지만 의해 등록되지 않은 태만.자세한 내용은 SimpleThreadScope의 설명서를 참조하십시오.

설명하는 것은 객체 풀입니다. 스프링에서는 프로토 타입 범위 인 FactoryBean으로 구현됩니다. 그리고 내부적으로는 Apache Commons/Pool과 같은 라이브러리를 사용할 것입니다.

+0

답장을 보내 주셔서 감사합니다. 싱글 톤 클래스를 안전하게하는 가장 좋은 방법은 무엇입니까? 나는 그것이 성능면에서 너무 비싸기 때문에 블록을 동기화하는 것이 좋지 않을 것이라고 생각한다. – Brolinuk

+0

@Brolinuk 때로는 동기화 된 블록이 필요할 때가 있습니다. 가끔은 그렇지 않습니다. 자세한 내용은 [Java Concurrency in Practice] (http://www.javaconcurrencyinpractice.com/)를 참조하십시오. 기본적으로 : 변경 가능한 상태가없는 경우 대개 스레드로부터 안전합니다. 그렇게하면 변경 가능한 상태에 대한 액세스를 동기화하는 방법이 필요합니다. 또한 [관련 SO 질문] (http://stackoverflow.com/questions/1237980/java-5-concurrency-book-recommendations) –

4

싱글 톤은 단 하나입니다. 하나의 인스턴스는 Spring 컨텍스트에 의해 관리되며, 모든 요청은 하나의 인스턴스를 동시에 처리합니다. 스레드로부터 안전하게 만드는 것은 당신에게 달려 있습니다.

bean이 스레드로부터 안전하지 않으면 non-singleton-scoped beans를 사용하는 것이 좋습니다. Spring에서는 요청, 세션 및 프로토 타입 범위를 사용할 수 있습니다.

+1

+1 "스레드 안전을 위해 당신까지"에 대한 포인트가 있다면 – Kurru

관련 문제