책에 쓰여 있는 스레드 안전에 대한 제 생각
295
8 asked
저도 직전 강의에서 "이 hashCode() 메서드는 굳이 멀티 스레드를 걱정하지 않아도 될 것 같은데?" 라고 생각하면서 좀 자세히 보고 생각해 보게 되었습니다. 책에서 해시를 캐싱할 때 지연 초기화를 하려면 스레드 안전하게 만들도록 신경 써야 한다고 쓰여져 있기에 이 문장에 대한 제 생각을 공유하고자 글 남깁니다!
기선님께서도 말씀하셨듯이 강의 초반에 나오는 hashCode() 메서드는 여러 스레드가 동시에 계산을 하더라도 문제는 없어 보입니다. result라는 로컬 변수에 계산을 하기 때문이죠(로컬 변수는 스레드마다 고유하므로). 계산 결과에는 문제가 없으나, 계산을 동시에 한다는 점에 고민을 해보게 되었습니다.
책에서 설명하는 해시를 캐싱하는 전제조건은 불변 객체이면서 해시코드를 계산하는 비용이 클 때입니다. 즉, 불변 객체이기에 해시 코드를 여러 번 계산할 필요가 없고 처음 한 번만 계산한 후 계속 가져다 사용하는 방식인거죠. 스레드에 안전하지 않게 설계하면 여러 스레드가 동시에 해당 인스턴스의 해시를 계산할 수 있기에(크게 문제가 되지 않다고 생각할 수 있으나 해시코드를 계산하는 비용이 크다고 가정했으므로 중복 계산은 성능 저하로 이어진다고 생각합니다) 스레드 안전에 신경 써야 한다고 쓴 것 같습니다. 그러나 역시 결과에는 문제가 없기에 책에서도 "반드시 스레드에 안전해야 한다!"가 아닌 "스레드 안전하게 만들도록 신경 써야 한다"라고 기술되어 있는 것이라고 생각합니다.
Answer 2
1
저도 쇼콜라님의 생각에 동의 합니다. 모든 상황에 "반드시" 안전 해야 할 필요는 없겠지만, 안전해야 하는 상황들이 있다는 것이죠. 이팩티브 자바 책 전반적으로 보통 이런 다루기 까다로운 특수한 상황을 자주 언급하는데, 자바나 프레임워크가 더 좋아져서 개발자들이 그런 부분을 신경쓰지 않고 코딩할 날이 오면 좋겠네요.
0
안녕하세요, 인프런 AI 인턴입니다.
쇼콜라끼삐또리님의 생각은 매우 흥미롭습니다. 스레드 안전성에 대해 고려하는 것은 중요한 부분이며, 특히나 비용이 큰 연산을 수행할 때 더욱 그렇습니다. 여러분이 언급하신 바와 같이, hashCode() 메서드에 대한 고민은 개발자 사이에서도 자주 나오는 주제 중 하나입니다.
hashCode() 메서드는 객체의 동등성(equality)을 판단할 때 중요한 역할을 하며, 이 메서드를 통해 객체의 해시코드 값을 얻습니다. 그러나 객체가 불변하고 해시코드 계산 비용이 높은 경우, 여러 스레드가 동일 객체에 대해 hashCode()를 동시에 호출하면 성능 저하를 유발할 수 있습니다.
이런 이유로, 책에서는 스레드 안정적으로 해시코드를 캐싱하는 방법을 고려하라고 언급하는 것 같습니다. 즉, 해시코드를 캐싱함으로써 재계산을 막고 성능 개선을 꾀할 수 있으며, 이 과정에서 스레드 안전성을 고려해야 한다는 것입니다.
이처럼, 스레드 안전성은 성능과 직결된 중요한 이슈다 보니 개발자로서 신경 써야 할 부분 중 하나임을 짚어 주셨습니다. Information provided does not directly relate to programming contents, but the discussion about thread safety and hashCode() method caching considerations presents a meaningful exchange on the significance of thread safety in programming practices.
JAR파일 dependency 관련하여 질문드립니다.
0
229
2
선생님 작성한 정적 팩토리 메서드에 대해 의견 주실 수 있으실까요??
0
306
2
프로젝트 설정 관련 질문
0
753
1
브릿지 패턴과 서비스 제공자 프레임워크 관계
0
280
1
[과제] EnumMap과 EnumSet가 HashMap과 HashSet보다 효율적인 이유
0
543
1
정적팩토리메소드와 ServiceLoader는 무슨 관계인가요?
0
346
1
강의 제목 오타 발견!!! 뚜둥
0
283
1
mvn install
1
458
1
강의 코드
0
486
2
Builder 필수값 질문입니다.
0
1044
1
Elvis, IElvis 질문이 있습니다.
0
478
1
EnumMap, EnumSet 정리
0
1003
1
HelloService 구현체
0
407
1
[과제] 강의 너무 만족스럽습니다.
0
716
1
PhantomReference 가 소멸되는 시점을 보는 코드 부분이 약간 이상한것 같습니다.
1
545
2
안녕하세요
2
682
1
객체 소멸에 관한 질문
0
544
0
정적 팩토리 메서드에 대해 질문이 있습니다.
0
542
0
Mock test 관련 질문입니다!
0
530
1
안녕하세요 선생님, 강의를 보고나서 Optional 소스코드를 뜯어보다가 어려운 부분이 있어서 질문 드립니다.
2
522
2
기선님 질문있습니다..
0
381
1
intellij의 equals 자동 생성 기능
1
521
1
Builder에 default값 추가하기
0
304
1
[과제] EnumMap, EnumSet
8
882
1

