복붙노트

[SPRING] Spring 객체는 쓰레드에 안전합니까?

SPRING

Spring 객체는 쓰레드에 안전합니까?

Spring 객체는 쓰레드에 안전합니까? 그렇지 않다면 어떻게 스레드를 안전하게 만들 수 있습니까?

해결법

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

    1.이들은 두 가지 무관 한 질문입니다 :

    이들은 두 가지 무관 한 질문입니다 :

    아니.

    Spring은 다른 Bean Scope (예 : Prototype, Singleton 등)을 가지고 있지만 이러한 모든 scope는 bean이 생성 될 때 적용됩니다. 예를 들어,이 bean이 "주입"될 때마다 "프로토 타입"범위 bean이 작성되는 반면, "singleton"| 범위 bean은 한 번 작성되어 응용 프로그램 컨텍스트에서 공유됩니다. 다른 범위가 있지만 새로운 인스턴스가 생성 될 시간 범위 (예 : 범위)를 정의합니다.

    위의 내용은 스레드 안전성과 관련이있는 경우에는 거의 없습니다. 즉, 여러 스레드가 범위에 관계없이 bean에 액세스 할 수있는 경우 해당 스레드가 "스레드 안전성"이 될지 여부 만 결정됩니다. .

    내가 "거의 없다"라고 말한 것은 그것이 해결하려고하는 문제에 달려 있기 때문입니다. 예를 들어, 2 개 이상의 HTTP 요청이 동일한 빈에 대해 문제를 일으킬 수 있는지 여부가 걱정된다면, 각 HTTP 요청에 대해 빈의 새로운 인스턴스를 생성하는 "요청"범위가 있으므로, 특정 bean은 다중 HTTP 요청의 맥락에서 "안전"합니다. 하지만 여러 스레드가 동일한 HTTP 요청 내에서이 빈을 사용하면 bean 디자인 (bean backing 클래스의 디자인)으로 돌아 간다.

    여러 가지 방법이 있습니다. 여기에 나열하기에는 너무 길지만 여기에 몇 가지 예가 있습니다.

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

    2.Spring은 thread의 안전성을 보증하지 않습니다. 그러나이 문제에 대한 지침을 제공합니다. bean이 state를 가지고 있다면 singleton bean scope를 사용하지 마십시오.

    Spring은 thread의 안전성을 보증하지 않습니다. 그러나이 문제에 대한 지침을 제공합니다. bean이 state를 가지고 있다면 singleton bean scope를 사용하지 마십시오.

    싱글 톤과 프로토 타입 스코프로 스프링 빈의 가변성을 보여주는 데모를 만들었습니다.

    Stateful Bean에 중점을 둔 다음 Singleton 및 Prototype 범위를 사용하여 콩이 자신의 상태를 변경하는 방법을 보여줍니다.

    Job 클래스는, 액티브 한 프로파일 세트에 근거 해로드 된 JobPrototype 및 JobSingleton Bean에 의해 확장됩니다. Tp set profile을 사용하여 spring.profiles.active 속성을 proto (프로토 타입 범위의 경우) 또는 singleton (Singleton 범위의 경우)

    활성 작업 빈은 Autowired Bean의 상태를 주기적으로 변경하는 Scheduled 메소드가있는 Runner 및 Runner1 Bean에서 자동으로 실행됩니다

    public class Job {
    
    protected int count = 0;
    
    void counter() {
        this.count++;
    }
    
    public int getCount() {
        return count;
    }
    

    }

    @Component
    @Profile("proto")
    @Scope("prototype")
    public class JobPrototype extends Job {
    }
    
    @Component
    @Profile("singleton")
    public class JobSingleton extends Job {
    
    }
    
    @Component
    public class Runner {
    
        private Logger Log = LoggerFactory.getLogger(this.getClass().getName());
        @Autowired
        private Job job;
    
        @Scheduled(fixedDelay = 1500)
        void count() {
            this.job.counter();
            Log.info("### Runner: count: " + this.job.getCount());
        }
    }
    
    @Component
    public class Runner1 {
    
        private Logger Log = LoggerFactory.getLogger(this.getClass().getName());
        @Autowired
        private Job job;
    
        @Scheduled(fixedDelay = 1000)
        void count() {
            this.job.counter();
            Log.info("### RunnerOne: count: " + this.job.getCount());
        }
    
    }
    

    결과는 다음과 같습니다.

    이 데모 전체 코드 beans_mutability

  3. from https://stackoverflow.com/questions/15745140/are-spring-objects-thread-safe by cc-by-sa and MIT license