싱글톤 Bean은 어떻게 동시 요청을 처리합니까?
싱글톤 빈이 동시 요청에 어떻게 대응하는지 질문이 있습니다.
StackOverflow에서 이 질문에 대해 검색했습니다.이것은 stackoverflow 링크의 예시인데, 높은 수준의 상세 정보만 찾았습니다.싱글톤 빈이 동시 요청을 처리하는 방법과 시스템 프로세서가 이러한 요청을 어떻게 인식하는지 자세히 알고 싶습니다.
온라인으로 시스템 프로세서의 동시 요청 처리에 대해 조사했습니다.그들은 프로세서 자체에 스케줄러가 있으며 스케줄러가 처리할 요청을 결정할 것이라고 말했다.
그래, 좋아.코어 프로세서가 여러 개 있는 경우 스케줄러는 동시 요청을 어떻게 처리합니까?
싱글톤 빈이 JVM과 시스템에서 동시 요청을 처리하는 방법에 대한 단계별 프로세스를 설명해 주실 수 있습니까?
이치노는 '수업하다' 같은 요.Sports
:
class Sports {
public void playFootball() {
}
public void playVolleyBall() {
}
}
두 가지 요청이 들어옵니다.은 '하다'입니다.playFootball
instance의 singleton 클래스 Sports
또 는 '아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아.playVolleyBall
class " " method method method method"Sports
.
싱글톤 인스턴스로 어떻게 가능하죠?
사라반 쿠마르
질문의 동기는 잘 알겠습니다.컴파일러 작업을 시작하기 전에 Java Virtual Machine의 내부 정보를 알고 싶다고도 했습니다.
우선 당신의 질문에 감명받았습니다.당신의 문제를 해결하려면 몇 가지 구별과 이해의 포인트가 필요합니다.첫 번째: 싱글톤 패턴(안티 패턴이라고도 함)을 사용하면 JVM(Java Virtual Machine)에서 사용할 수 있는 이 클래스의 인스턴스는 1개뿐입니다.즉, 어플리케이션에 글로벌 상태를 도입하는 것입니다.이해하시겠지만, 이건 단지 해명할 사항일 뿐입니다.
자, 이제 내부자.
클래스의 인스턴스를 만들 때 JVM의 공유 메모리에 상주하는 개체를 만듭니다.이러한 스레드는 이러한 인스턴스에서 작동하는 코드를 독립적으로 실행합니다.각 스레드에는 모든 스레드 간에 공유되는 메인 메모리의 데이터를 유지하는 작업 메모리가 있습니다.작성한 Singleton 객체에 대한 참조가 여기에 있습니다.기본적으로는 생성된 싱글톤 오브젝트를 나타내는 바이트 코드가 이들 스레드 각각에서 실행되고 있습니다.
이 문제의 내역은 다음과 같습니다.
각 JVM 스레드에는 스레드와 동시에 생성된 개인 JVM 스택이 있습니다.이제 JVM에는 모든 JVM 스레드 간에 공유되는 힙이 있습니다.힙은 모든 클래스 인스턴스와 배열의 메모리가 할당되는 런타임 데이터 영역입니다.VM을 시작할 때 힙이 생성됩니다.스레드가 싱글톤인스턴스를 요구하면 이 싱글톤의 바이트 코드가 존재하는 힙 내의 참조를 가리킵니다.적절한 코드를 실행합니다.당신의 경우 첫 번째 요청에는 첫 번째 메서드가 실행되고 두 번째 요청에는 두 번째 메서드가 실행됩니다.컴파일러가 이 인스턴스가 할당되어 있는 힙 내의 영역을 프로그램카운터로 포인트 하는 것을 막는 잠금이나 제한이 없기 때문에 이것이 가능합니다.Singleton 클래스가 Java Virtual Machine에 부과하는 유일한 제한은 이 클래스의 힙에 인스턴스를 하나만 포함할 수 있다는 것입니다.그게 다예요.그 외에는 메서드에서 100배 참조할 수 있습니다.컴파일러는 같은 바이트 코드를 가리키고 간단하게 실행할 수 있습니다.따라서 일반적으로 Singleton 클래스는 스테이트리스로 해야 합니다.이는 스레드 중 하나라도 액세스할 경우 동시성 제어 부족으로 인해 내부 변수가 변환되는 것을 원치 않기 때문입니다.
궁금하신 점이 있으시면 연락주세요!
이상적인 싱글톤 빈은 어떤 상태도 유지해서는 안 된다.즉, 서비스 중인 요청에 고유한 변수를 저장하지 않습니다.
따라서 싱글톤 빈에는 여러 요구에 대해 동시성 문제 없이 동시에 실행할 수 있는 상태 비저장 코드(컨트롤러 메서드 등)가 있습니다.
예를 들어, 다음과 같은 것이 싱글톤빈인 경우:
@Service
public class Calculator {
public int sum(int a, int b) {
return a + b;
}
}
말하면, 2개의 「이 「요청」을 호출했을 , 「요청」은 「요청」을 호출합니다.sum
, 즉 콩의 방법, 콩의 방법, 콩의 , 콩의 방법, 콩의 방법.sum
메서드는 두 개의 다른 스레드에서 동시에 실행됩니다.따라서 서로 겹치지 않는 자체 실행 컨텍스트가 있습니다.이렇게 하면 동시에 안전하게 실행할 수 있습니다.
같은 콩이 다음과 같은 상태일 경우:
@Service
public class Calculator {
int incrementalMultiplier = 0;
public int mulitply(int a, int b) {
incrementalMultiplier++;
return a * b * incrementalMultiplier;
}
}
할 때 가 발생할 수 있습니다.는 2개의 요구를 동시에 처리할 수 있다.incrementalMultiplier
는 2개의 요구(예상치)에 의해 공유되는 오브젝트레벨 스테이트로, 예기치 않은 결과가 발생할 가능성이 있습니다.
즉, 스테이트리스 싱글톤은 다른 스레드에 존재하기 때문에 2개의 요구를 동시에 처리할 수 있습니다.
공유 싱글톤 빈을 상태 비저장 상태로 유지하라는 많은 조언을 들어왔고 웹 앱 백업 빈의 스테이트풀 싱글톤이 이치에 맞는 사용 사례를 제시하고자 합니다.
관리용 웹 앱은 필요에 따라 두 개의 개별 시스템(CRM과 Digital Assets Manager(DAM))에서 사용자 데이터를 조회하고 레코드를 비교한 후 API를 사용하여 DAM을 업데이트합니다.업데이트가 많으면 이 작업에 시간이 오래 걸릴 수 있습니다.브라우저는 1초마다 ajax를 사용하여 백업빈을 폴링하여 진행률 표시줄과 처리한 사용자 계정 수를 표시하므로 웹 UI는 업데이트 상태를 실시간으로 표시합니다.UI는 동기화 프로세스를 시작하기 위한 버튼과 중지하기 위한 버튼도 제공합니다.동기화 버튼은 처음에 활성화되어 있으며 중지 버튼은 렌더링되지 않습니다.사용자가 시작 버튼을 클릭하면 시작 단추가 비활성화되고 중지 단추가 활성화됩니다.
동기화가 활성화되어 있는 동안 다른 클라이언트(다른 브라우저의 웹 앱을 사용하는 키보드의 다른 사용자)가 동일한 상태(프로그레스 바 및 처리된 사용자 계정 수 및 버튼 상태)를 볼 수 있도록 합니다.이것은 이미 처리 중인 두 번째 동기화 프로세스를 시작하는 것은 의미가 없기 때문에 중요합니다.
자세한 내용은 싱글톤 빈이 동시 요청을 어떻게 처리합니까?당신은 봄콩에 대해 다음 사항을 알아야 합니다.
빈 스코프
봄에는 콩 범위(예: 프로토타입, 싱글톤 등)가 다릅니다만, 이러한 범위는 모두 콩이 생성되었을 때입니다.' 은 한 번 응용 합니다.한편, 「싱글톤」스코프 빈은 1회 작성되어 애플리케이션 컨텍스트내에서 공유됩니다.
Beansingleton Spring 의 기본빈의 작성
스프링빈의 전체 라이프 사이클은 스프링 컨테이너(예: ApplicationContext/BeanFacotry) 스프링 컨테이너가 내부적으로 콩 정의(예: 콩 정의)를 참조합니다.XML base ot Annotation based)를 사용하여 해당 bean 정의에 의해 정의된 클래스의 실제 인스턴스를 만듭니다.Spring Container가 시작되면 bean 정의를 참조하고 정의된 모든 bean을 설치합니다.
콩을 요구하다.
이제 객체가 콩에 요청을 하면 스프링 컨테이너가 이미 초기화된 콩을 인계합니다.
이게 도움이 되길...
이 질문은 현재(2019년) 5년 이상 된 것으로, 찾고 있는 것을 발견하셨으면 좋겠다고 생각합니다만, 그래도 답변해 드리겠습니다.이는 질문을 커버할 뿐만 아니라 여러 번 반복하는 동작에 대해서도 간략하게 설명할 수 있습니다.
먼저 싱글톤은 프로그래밍에서 사용되는 디자인 패턴으로, 애플리케이션 전체에 대해 하나의 인스턴스만 생성하기 위해 사용됩니다(JVM은 1개뿐입니다. 앱에 JVM이 1개만 있으면 됩니다).멀티스레딩은 처리 메커니즘입니다.작업을 동시에 실행합니다.스레드가 논리적인 처리 장소라는 것을 이미 알고 있기 때문에 혼란스럽다고 생각합니다.오브젝트는 메모리인스턴스입니다하지만 당신은 실제로 후드 아래에서 멀티캐스팅이 어떻게 작동하는지 이해하지 못했습니다. 당신의 질문에 대해서는 스프링 프레임워크로 설명하겠습니다.
따라서 사용자가 서버에 요구를 송신하면 서버는 각 요구에 대해 개별 스레드를 전용으로 합니다.봄에는 기본적으로 콩이 싱글톤이 됩니다.따라서 첫 번째 요구는 싱글톤 빈의 메서드를 실행하기 시작하고 완료되기 전에 다른 요구가 와서 다른 스레드를 사용하여 동일한 메서드를 실행합니다.
즉, 두 번째 스레드는 첫 번째 스레드의 전체 메서드 실행이 완료될 때까지 기다리지 않습니다.동시에 실행됩니다.즉, 첫 번째 요구는 메서드의 첫 번째 행을 실행하고 두 번째 스레드는 첫 번째 행을 실행하기 시작합니다.두 번째 줄도 있겠지첫 번째 스레드가 첫 번째 행을 실행하는 동안 두 번째 스레드는 동일한 행을 실행할 수 없으며 두 번째 스레드가 첫 번째 행과 두 번째 행을 실행하는 동안 첫 번째 스레드가 두 번째 행을 완료할 때까지 두 번째 행을 실행할 수 없습니다.
이것을 동시 실행이라고 부릅니다만, 전혀 동시에 실행되지 않습니다.(한 행은 한 개의 스레드에 의해서만 동시에 실행된다) 질문에 따르면 빈에 두 개의 메서드가 정의되어 있기 때문에 두 개의 메서드를 동시에 요구하는 두 개의 스레드가 동시에 실행됩니다.따라서 제가 설명한 내용은 해당 시나리오에 적용되지 않으며, 각 요청에 대해 콩이 새로 생성되면 이 작업도 수행되지 않고 동시에 실행됩니다.
싱글톤은 빈 스코프입니다.다중 스레드 액세스에 사용할 수 있는 방법을 처리해야 합니다.동기패키지 또는 동시패키지를 사용할 수 있습니다.참조: 스프링 싱글톤 콩은 스레드 세이프입니까?
동시 요청의 경우 단일 빈은 여러 요청을 하나씩 처리합니다.
언급URL : https://stackoverflow.com/questions/25617962/how-does-the-singleton-bean-serve-the-concurrent-request
'programing' 카테고리의 다른 글
리액트 훅의 '유출 감소' 보풀 규칙 이해 (0) | 2023.02.25 |
---|---|
'동형 반응'이 무슨 뜻이죠? (0) | 2023.02.25 |
ng-timeout: 객체 배열 내의 각 객체에 대한 접근키와 값 (0) | 2023.02.25 |
Wordpress에서 분류법을 제거하려면 어떻게 해야 합니까? (0) | 2023.02.25 |
Oracle ODP.net Managed 드라이버와 Unmanaged 드라이버 (0) | 2023.02.25 |