강의를 듣던 도중 HashMap이라는 자료구조를 사용했는데,
더불어 동시성 문제에 대한 이야기를 해주셨다.
딥하게 말씀 해주신 부분이 아니라 간단하게 찾아봤다.
현재는 아래 처럼 데이터를 저장하고 있는데, 이 저장공간인 store 는 HashMap으로 선언 되어 있다.
private static Map<Long, Member> store = new HashMap<>();
private static long sequence = 0L;
@Override
public Member save(Member member) {
member.setId(++sequence);
store.put(member.getId(), member);
return member;
}
....
Thread-Safe 란?
동기화(Synchronize) 라고 표현하기도 하며 어떠한 Class의 인스턴스가 여러개의 Thread에서 동시 참조되고 해당 객체에 Operation 이 발생해도 정합성을 유지해줄때 보통 우리는 Thread-Safe 하다 라고 표현한다.
AtomicLong과 같이 threadSafe한 타입을 사용하지 않는다면
이미 A스레드에 의해 증가된 시퀀스가 B스레드가 들고 있던 값으로 덮어쓰여질 수 있다
현재 코드 구조로는 동일한 시퀀스에 대한 예외처리도 없기 때문에
Map에 동일한 시퀀스를 가지게 되는 요소가 존재할 수 있게 됩니다.
*시퀀스 는 사용자가 생성한 데이이터베이스 객체이다. SEQUENCE에 대한 전형적인 사용은 각 행에 대하여 유일해야 하는 PRIMARY KEY 값을 생성하기 위해서 보통 사용 됩니다.