강의를 듣던 도중 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;
}
....

HashMap은 thread-safe하지 않다.

Thread-Safe 란?

동기화(Synchronize) 라고 표현하기도 하며 어떠한 Class의 인스턴스가 여러개의 Thread에서 동시 참조되고 해당 객체에 Operation 이 발생해도 정합성을 유지해줄때 보통 우리는 Thread-Safe 하다 라고 표현한다.

멀티스레드로 동작하는 애플리케이션의 경우

AtomicLong과 같이 threadSafe한 타입을 사용하지 않는다면

이미 A스레드에 의해 증가된 시퀀스가 B스레드가 들고 있던 값으로 덮어쓰여질 수 있다

현재 코드 구조로는 동일한 시퀀스에 대한 예외처리도 없기 때문에

Map에 동일한 시퀀스를 가지게 되는 요소가 존재할 수 있게 됩니다.

*시퀀스 는 사용자가 생성한 데이이터베이스 객체이다. SEQUENCE에 대한 전형적인 사용은 각 행에 대하여 유일해야 하는 PRIMARY KEY 값을 생성하기 위해서 보통 사용 됩니다.