작성
·
182
0
저도 직전 강의에서 "이 hashCode() 메서드는 굳이 멀티 스레드를 걱정하지 않아도 될 것 같은데?" 라고 생각하면서 좀 자세히 보고 생각해 보게 되었습니다. 책에서 해시를 캐싱할 때 지연 초기화를 하려면 스레드 안전하게 만들도록 신경 써야 한다고 쓰여져 있기에 이 문장에 대한 제 생각을 공유하고자 글 남깁니다!
기선님께서도 말씀하셨듯이 강의 초반에 나오는 hashCode() 메서드는 여러 스레드가 동시에 계산을 하더라도 문제는 없어 보입니다. result라는 로컬 변수에 계산을 하기 때문이죠(로컬 변수는 스레드마다 고유하므로). 계산 결과에는 문제가 없으나, 계산을 동시에 한다는 점에 고민을 해보게 되었습니다.
책에서 설명하는 해시를 캐싱하는 전제조건은 불변 객체이면서 해시코드를 계산하는 비용이 클 때입니다. 즉, 불변 객체이기에 해시 코드를 여러 번 계산할 필요가 없고 처음 한 번만 계산한 후 계속 가져다 사용하는 방식인거죠. 스레드에 안전하지 않게 설계하면 여러 스레드가 동시에 해당 인스턴스의 해시를 계산할 수 있기에(크게 문제가 되지 않다고 생각할 수 있으나 해시코드를 계산하는 비용이 크다고 가정했으므로 중복 계산은 성능 저하로 이어진다고 생각합니다) 스레드 안전에 신경 써야 한다고 쓴 것 같습니다. 그러나 역시 결과에는 문제가 없기에 책에서도 "반드시 스레드에 안전해야 한다!"가 아닌 "스레드 안전하게 만들도록 신경 써야 한다"라고 기술되어 있는 것이라고 생각합니다.
답변 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.