• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

PropertyEditor non thread-safe 한 이유

22.03.07 15:26 작성 조회수 273

0

안녕하십니까

한가지만 여쭤봐도 될까요?

제가 기초가 부족해서 갑자기 이부분이 헷갈리더라고요 죄송합니다 

강의를 보던중에 PropertyEditor는 non thread-safe라서 변수를 공유하기 때문에 값이 달라질수 있다고 하셔서(싱글톤이라 그런가요?) 궁금증이 생겼는데

스프링에서 단순 클래스에서 변수를 사용하는 것은 공유를 안하나요?

ex) public class Test{

                   int i = 1;

...

}

스프링에서 여러명이 동시에 클래스 또는 함수를 사용해서 i 값을 변경해도 해당 사용자는 독립적으로 i 값을 참고하나요?

 

답변 1

답변을 작성해보세요.

0

안녕하세요. 좋은 질문 감사합니다.

당연히 int i 라는 값도 여러 쓰레드가 동시에 사용할 때 멀티 스레드에 안전한 변수가 아닙니다. 즉, 값이 막 다른 쓰레드에서 변경한 값으로 바뀔 수가 있다는 말이죠. 그래서 싱글톤으로 사용할 클래스에 있는 변수들은 쓰레드 세이프한 방법으로 쓰거나, 태초부터 여러 쓰레드에서 동시에 써도 안전한 인스턴스만 써야 합니다.

PropertyEditor는 보여주신 예제처럼 여러 쓰레드에서 공유하는 변수가 생기기 때문에 멀티 쓰레드 환경에서 안전하지 않은 겁니다. 그 대안으로 권장해 드린, Formatter는 저렇게 공유하는 데이터 자체가 없기 때문에 멀티쓰레드 환경에서 써도 안전한 거구요.

 

배효셩님의 프로필

배효셩

질문자

2022.03.08

답변감사합니다.

"여러 쓰레드에서 동시에 써도 안전한 인스턴스만 써야 합니다"  

이 부분만 조금 더 설명해 주실수 있으신가요?

"멀티 쓰레드에 안전한 인스턴스"라는게 여러가지가 있거든요. 위에서 언급한것 처럼 상태가 없는 인스턴스도 그런 인스턴스들 중에 하나이고, 불변 객체도 당연히 안전하구요, 모든 메소드에 synchronized 키워드를 사용한 인스턴스도 안전하겠죠. 멀티 쓰레드에서 공유해서 사용하는 인스턴스는 그런식으로 멀티 쓰레드에 안전한 인스턴스만 사용해야 한다는 말입니다.

배효셩님의 프로필

배효셩

질문자

2022.03.08

답변 감사합니다.