Post

01 RaceCondition

01 RaceCondition

1. Race condition

1. RaceCondion

  • 여러 스레드나 프로세스가 동시에 공유 자원에 접근할 때, 실행 순서나 타이밍에 따라 프로그램의 결과가 달라지는 상태
  • “누가 먼저 실행되느냐에 따라 결과가 달라지는 문제”
  • 동시성(concurrency) 환경에서 주로 발생하며, 예측 불가능하고 디버깅이 어려움

2. 특징

  • 공유 자원 접근: 여러 스레드/프로세스가 같은 변수, 메모리, 파일 등을 동시에 읽고 쓸 때 발생
  • 결과 불확정: 실행 순서에 따라 프로그램 결과가 달라짐
  • 발견 어려움: 항상 발생하지 않고 특정 타이밍에서만 발생하기 때문에 디버깅이 어려움

3. 예시

1
2
3
4
int count = 0;

Thread1: count = count + 1;
Thread2: count = count + 1;
  • Thread1과 Thread2가 동시에 실행되면, count가 1만 증가하거나 2가 되어야 하지만
  • 메모리 접근 타이밍에 따라 1만 증가하는 Race condition이 발생할 수 있음

4. 해결방법

  • 동기화(synchronization): synchronized, mutex, lock 등을 사용
  • 원자적 연산(atomic operation): AtomicInteger 같은 클래스 사용
  • 불변 객체 사용(immutable objects): 상태 변경을 막아 Race condition 방지

2. note

1. 2025.09.03. SFTP 연동 문제

개념은 알고는 있었으나, 문제가 없는 로직을 그대로 사용한거라 환경이 바뀌면서 발생하는 것을 인지하지 못했던 일

1. 스프링 스케줄러를 사용중에 RestAPI로 전환함.

  • 진행 로직은 영업부서에서 우리 OS에 파일을 넣으면, AP가 있는 파드에서 기존 파일을 지우고, DAT파일 가져와서 읽는 구조
  • 스프링 스케줄러에서 문제가 없고, 그냥 실행만 변경하는 건으로 기존 배치 로직을 그대로 가져와서 사용

2. 문제

  • 테스트 과정에서 거의 문제가 없었고 극히 희박하게 연동중에 원인을 알 수 없는 오류가 발생함.
  • 근데 다시 진행하면 문제가 없어 AP로 Reqeust주는곳도 신규 시스템이라 그쪽 문제라고 추정해서 바톤이 핑퐁함.

3. 원인

  • 후행에서 진행한 스레드가 본인의 요청을 처리하기 위해 기존 파일을 지우는 상황 + 선행에서 작업 완료한 파일을 이동하는 과정에서 발생함.
  • 스프링 스케줄러를 사용할때 단일 pod에서 큐로 순차적으로 진행해서 문제가 없었음.
  • DEV환경에서는 순차적으로 수동으로 버튼 1개씩 눌러서 실행하다보니 처리속도가 더빨라서 인지를 하지 못함.(스프링 스케줄러랑 비슷한 상황이됨)
  • PRD에서는 4개 파드가 동시 작동하기 때문에, 약간의 시간차에서 발생함.

4. 해결

  • 파드에서 연동 파일을 읽을때 특정 파일만 읽고 있는데, 지울때 전체를 지우지말고 특정 파드만 지우도록 변경.
  • 스레드에서 공통된 자원을 사용하는 경우 가능한 명확한 타겟을 설정하는 작업이 필요할듯.

5. note-note

  • A파드에서 스레드락을 걸어도, B파드에서는 다른 AP라 적용이 안되는 부분이 있어서 스레드락은 생각을 안했는데 뭔가 좋은 방법이 있을 것 같은데..
This post is licensed under CC BY 4.0 by the author.