skarltjr / Memory_Write_Record

나의 모든 학습 기록
0 stars 0 forks source link

스프링빈과 스레드세이프 #109

Open skarltjr opened 2 years ago

skarltjr commented 2 years ago

스레드 세이프란

다수의 스레드에서 특정 객체, 자원 등에 동시 접근하여 로직을 수행하여도 안전한 것

스프링빈은 스레드 세이프할까?

1. 기본적으로 스프링빈의 scope는 싱글톤
2. 스프링 환경은 멀티 스레드
3. 스프링빈은 기본적으로 스레드세이프하지 않다!⭐️

그럼 문제가 생기지 않을까?

기본적으로 스프링빈은 스레드세이프하지 않다.
다만 불변 객체를 통해 변화를 방지함으로써 스레드세이프하게 작동하도록 코드를 짠다

⭐️대표적인 예시가 바로 생성자 주입이다.
생성자 주입을 통해 우리는 불변을 도모하도록 코드를 작성한다.

문제 상황

@Component
public class Aservice{
  int value = 0;
  public int edit(int otherValue){
    value +=otherValue;
    return value;
  }
}

지금 이 상황은 스레드세이프하지 못한 빈에 수정 가능한 변수가 존재
동시에 여러곳에서 접근할 수 있는 public한 상황
이러한 경우가 바로 문제가 생길 수 있는 상황이다.

프로토타입 scope

기본적으로 스프링의 scope는 싱글톤이지만
prototype을 사용한다면 매 요청시마다 새로운 객체가 생성되어처리

다만 매 요청시마다 새로운 객체를 생성한다는것 자체가 큰 단점이기때문에 주의해서 사용할것