여러 프로세스(또는 스레드)가 동시에 같은 자원에 접근할 때,
실행 순서에 따라 결과가 달라지는 상태
→ 누가 먼저 실행하느냐에 따라 결과가 바뀜
핵심 조건
- 공유 자원 존재
- 동시에 접근
- 순서 제어 없음
해결방법
- mutex(락)
- 한 번에 한 스레드만 자원 접근 허용
- 사용할 때는 lock, 작업 후 unlock
- 동시에 접근을 하지 못하게 하여 순서가 정상적으로 됨
- semaphore
- 동시에 접근 가능한 개수를 제한하는 카운터
- 3으로 설정하면 접근할 떄마다 1이 감소되고 카운터가 0이면 대기
- 접근 수를 제한해서 충돌 가능성을 줄이고 제어할 수 있다.
- synchronized
- 코드 작성시 코드 블록에 락을 걸어 해당 블록에는 한 번에 한 쓰레드만 접근하고 실행할 수 있게 한다.
- 주로 자바에서 사용한다.
- atomic연산
- 쪼개지지 않고 한 번에 실행되는 연산
- 시작하면 중간에 다른 스레드가 끼어들지 못하고 실행시킨다.