복붙노트

[SPRING] 싱글 톤 Bean은 동시 요청을 어떻게 처리합니까?

SPRING

싱글 톤 Bean은 동시 요청을 어떻게 처리합니까?

싱글 톤 빈이 동시에 동시 요청을 처리하는 방법에 관한 질문이 있습니다.

이 질문과 관련하여 StackOverflow를 검색했습니다. 이것은 stackoverflow에서 샘플 링크지만, 높은 수준의 세부 사항을 발견. 싱글 톤 빈이 동시 요청을 처리하는 방법과 시스템 프로세서가 이러한 요청을 보는 방법에 대한 자세한 내용을 원한다.

시스템 프로세서 온라인에서 동시 요청 처리와 관련하여 연구했습니다. 그들은 프로세서 자체에 스케줄러가 있으며 스케줄러가 어떤 요청을 처리할지 결정할 것이라고 말했다.

알았어 괜찮아. 둘 이상의 코어 프로세서가 있다고 가정하면 스케줄러가 동시 요청을 어떻게 처리합니까?

누구나 singleton bean이 JVM과 시스템에서 동시 요청을 처리하는 방법에 대한 단계별 프로세스를 설명 할 수 있습니까?

구체적인 예를 들어 설명하겠습니다. 스포츠와 같은 수업이 있습니다.

class Sports {
    public void playFootball() {
    }

    public void playVolleyBall() {
    }
}

두 개의 요청이 들어옵니다. 첫 번째 요청은 Sports 클래스의 생성 된 싱글 톤 인스턴스에서 playFootball 메서드를 실행하는 것입니다. 동시에 다른 요청은 Sports 클래스의 동일한 생성 된 싱글 톤 인스턴스에서 playVolleyBall 메서드를 실행합니다.

싱글 톤 인스턴스로 어떻게 가능합니까?

해결법

  1. ==============================

    1.사울 쿠마르,

    사울 쿠마르,

    나는 당신의 질문 뒤에 동기 부여를 이해합니다. 컴파일러 작업을 시작하기 전에 JVM (Java Virtual Machine)의 내부 구조를 알고 싶었습니다.

    우선, 귀하의 질문에 깊은 인상을 받았습니다. 귀하의 질문을 해결하기 위해서는 두 가지 구별과 이해가 필요합니다. 첫 번째 : 싱글 톤 패턴 또는 때때로 안티 패턴이라고도하는이 패턴은 JVM (Java Virtual Machine)에서 사용할 수있는이 클래스의 인스턴스가 하나만 있음을 보장합니다. 이것은 우리가 본질적으로 애플리케이션에 전역 상태를 도입한다는 것을 의미합니다. 나는 당신이이 사실을 이해하고 있음을 알고 있지만 그것은 단지 설명의 요점 일뿐입니다.

    이제 내부.

    클래스의 인스턴스를 만들 때 JVM의 공유 메모리에있는 객체를 만듭니다. 이제 이러한 스레드는 이러한 인스턴스에서 작동하는 코드를 독립적으로 실행합니다. 각 스레드는 작업 메모리를 가지며,이 스레드는 모든 스레드간에 공유되는 주 메모리의 데이터를 유지합니다. 이것은 여러분이 생성 한 Singleton 객체에 대한 참조가 상주하는 곳입니다. 기본적으로 생성 된 바이트 코드가 생성 한 싱글 톤 객체를 나타내는 것은이 스레드 각각에서 실행되고 있다는 것입니다.

    이제 이것이 어떻게 발생하는지에 대한 내부 내용은 다음과 같습니다.

    각 JVM 스레드에는 스레드와 동시에 생성 된 개인 JVM 스택이 있습니다. 이제 JVM에는 모든 JVM 스레드간에 공유되는 힙이 있습니다. 힙은 모든 클래스 인스턴스 및 배열의 ​​메모리가 할당되는 런타임 데이터 영역입니다. 힙은 VM 시작시 작성됩니다. 스레드가 싱글 톤 인스턴스를 요청하면이 싱글 톤의 바이트 코드가있는 힙의 참조를 가리 킵니다. 적절한 코드를 실행하려고합니다. 귀하의 경우, 그것은 첫 번째 요청에 대한 첫 번째 방법과 두 번째 요청에 대한 두 번째 방법을 실행하려고합니다. 컴파일러가이 인스턴스가 할당 된 힙의 영역에 프로그램 카운터를 지정하지 못하도록 잠금 또는 제한이 없기 때문에이 작업을 수행 할 수 있습니다. Singleton 클래스가 JVM (Java Virtual Machine)에 부여하는 유일한 제한 사항은이 클래스의 힙에 인스턴스를 하나만 가질 수 있다는 것입니다. 그것은 간단합니다. 그것 이외에, 당신은 당신의 메소드로부터 100 배를 참조 할 수있다. 컴파일러는 같은 바이트 코드를 가리키고 간단히 그것을 실행할 것이다. 이것이 우리가 일반적으로 싱글 톤 클래스를 무 상태로 만들고자하는 이유입니다. 왜냐하면 어떤 스레드가이 스레드에 액세스한다면 동시성 제어가 부족하기 때문에 내부 변수가 변경되기를 원하지 않기 때문입니다.

    궁금하신 점이 있으면 알려주세요.

  2. ==============================

    2.이상적인 싱글 톤 빈은 어떤 상태도 유지하면 안됩니다. 즉, 제공하는 요청과 관련된 모든 것을 저장하는 변수가 없습니다.

    이상적인 싱글 톤 빈은 어떤 상태도 유지하면 안됩니다. 즉, 제공하는 요청과 관련된 모든 것을 저장하는 변수가 없습니다.

    따라서 싱글 톤 빈은 동시성 문제없이 여러 요청에 대해 동시에 실행될 수있는 무 상태 코드 (예 : 컨트롤러 메소드)를 갖게됩니다.

    예를 들어 싱글 톤 빈이 다음과 같다면 :

    @Service
    public class Calculator {
    
       public int sum(int a, int b) {
            return a + b;
       } 
    
    }
    

    간단히 말해서 두 개의 "요청"이 동시에 콩의 sum 메소드를 호출 할 때 sum 메소드가 두 개의 다른 스레드에서 동시에 실행된다는 의미입니다. 따라서 서로 겹치지 않는 자체 실행 컨텍스트를 갖게됩니다. 이렇게하면 안전하게 동시에 실행될 수 있습니다.

    같은 bean이 다음과 같은 상태를 가지면 :

    @Service
    public class Calculator {
    
       int incrementalMultiplier = 0;
    
       public int mulitply(int a, int b) {
            incrementalMultiplier++;
            return a * b * incrementalMultiplier;
       } 
    
    }
    

    이는 incrementalMultiplier가 두 개의 요청 (스레드)에 의해 공유되어 예상치 못한 결과를 생성 할 수있는 객체 레벨 상태이므로 두 개의 요청을 동시에 처리 할 때 문제를 일으킬 수 있습니다.

    즉, 스테이트리스 싱글 톤은 서로 다른 스레드에 있기 때문에 두 개의 요청을 동시에 처리 할 수 ​​있습니다.

  3. ==============================

    3.공유 된 싱글 톤 빈을 stateless 상태로 유지하라는 충고를 많이 보았고 웹 애플 백킹 빈에있는 스테이트 풀 싱글 톤이 의미가있는 사용 사례를 제시하고자했습니다.

    공유 된 싱글 톤 빈을 stateless 상태로 유지하라는 충고를 많이 보았고 웹 애플 백킹 빈에있는 스테이트 풀 싱글 톤이 의미가있는 사용 사례를 제시하고자했습니다.

    요청에 따라 사용자 데이터에 대해 두 개의 개별 시스템 (CRM 및 Digital Assets Manager - DAM)을 쿼리하고 레코드를 비교하며 해당 API를 사용하여 DAM을 적절히 업데이트하는 관리 웹 응용 프로그램이 있습니다. 많은 업데이트가있는 경우이 작업은 때로는 매우 오랜 시간이 걸릴 수 있습니다. 웹 UI는 실시간으로 업데이트 상태를 표시합니다. 브라우저가 1 초마다 ajax를 사용하여 백업 빈을 폴링하여 진행률 표시 줄과 처리 한 사용자 계정 수를 표시합니다. 또한 UI에는 동기화 프로세스를 시작하는 버튼과 중지 할 버튼이 있습니다. 동기화 단추는 처음에 사용 가능하며 중지 단추는 렌더링되지 않습니다. 사용자가 시작 버튼을 클릭하면 시작 버튼이 비활성화되고 중지 버튼이 활성화됩니다.

    동기화가 활성화되어있는 동안 서로 다른 클라이언트 (별도의 브라우저에서 웹 앱을 사용하는 키보드의 다른 사용자)가 진행 상태 표시 줄과 처리 된 사용자 계정 수 및 버튼 상태와 같은 상태를보고 싶습니다. 이미 진행 중일 때 두 번째 동기화 프로세스를 시작하는 것은 의미가 없기 때문에 이것은 중요합니다.

  4. ==============================

    4.세부 사항을 알려면 싱글 톤 Bean은 동시 요청을 어떻게 처리합니까? 당신은 Spring Beans에 대해 다음과 같은 것들을 알아야합니다.

    세부 사항을 알려면 싱글 톤 Bean은 동시 요청을 어떻게 처리합니까? 당신은 Spring Beans에 대해 다음과 같은 것들을 알아야합니다.

    이게 너를 도울 수 있기를 바란다 ...

  5. ==============================

    5.싱글 톤은 빈 범위이다. 여러 스레드 액세스를 처리하는 방법을 처리해야합니다. 동기화 또는 동시 pakage를 사용할 수 있습니다. 참고 : 스프링 싱글 톤 빈은 쓰레드에 안전한가요?

    싱글 톤은 빈 범위이다. 여러 스레드 액세스를 처리하는 방법을 처리해야합니다. 동기화 또는 동시 pakage를 사용할 수 있습니다. 참고 : 스프링 싱글 톤 빈은 쓰레드에 안전한가요?

    동시 요청의 경우, 단일 Bean은 하나씩 여러 요청을 처리합니다.

  6. from https://stackoverflow.com/questions/25617962/how-does-the-singleton-bean-serve-the-concurrent-request by cc-by-sa and MIT license