static field에 객체를 넣어 쓸 때는 thread-safe을 꼭 확인하자.

너무 쉬운 내용인데도 가끔 놓친다.

Screen Shot 2019-03-27 at 9.32.24 PM.png

보통 프로세스에서 사용하는 메모리 공간은 Code, data(static), heap, stack 영역으로 나누어진다. 프로세스는 이 네 개의 계층을 각각 모두 갖지만, 쓰레드는 경량화된 동시성 제어 컨셉이기 때문에 code, data, heap을 공유한다.

static field로 선언된 것은 data 영역에 들어가게 되고, 이는 힙에 생성 되는 객체들이 서로 다른 쓰레드에서도 공유할 수 있다. 서로 다른 쓰레드에서 해당 데이터에 thread-safe하지 않게 접근하면 문제가 발생할 수 있다.

오늘 깜박 저지른 실수는, SimpleDateFormat을 static field로 정의한 것이다. 날짜 포맷만 정해놓고 여러 객체에서 이를 사용하면 되니깐 static field로 정의한 것은 합리적이다. 하지만 thread-safe하지 않은 SimpleDateFormat를 사용한 것이 잘못이다. 뒤늦게 이를 알아 차리고 DateTimeFormatter로 바꿨다. 보통 ~~Format으로 된 것은 thread-safe하지 않고, ~~Formatter로 시작하는게 thread-safe하는 팁까지 얻었다.

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중

search previous next tag category expand menu location phone mail time cart zoom edit close