작성자 : 황지성
동시성 제어의 필요성
- 동시성 문제는 멀티 쓰레드(Multi Thread) 환경에서 발생하는 문제이다.
여러 쓰레드가 동시에 공유자원에 접근해서 수정을 하는 경우 발생한다.
동시에 값을 수정했을 때, 각 쓰레드가 기대하던 값과는 다른 형태의 값이 들어올 가능성이 있기 때문이다.
동시성 문제는 쓰레드가 단순히 싱글톤 객체에 단순히 ‘조회’만 하는 경우에는 발생하지 않는다.
위에서 언급했던 것처럼 동일한 자원(공유 자원)에 접근해서 수정을 했을 때 발생한다.
이러한 동시성 문제를 해결하기 위한 동시성 제어에 대한 고민이 필요했고 아래와 같은 방법들을 통해 동시성 제어를 할 수 있다는 것을 알게 되었다.
Race Condition
- 동시성 제어를 알아보기 전 Race Condition이 무엇인지 먼저 알아보자.
- Race Condition이란 두 개 이상의 프로세스가 공유 자원을 병행적으로 읽거나 쓰는 동작을 할 때, 공용 데이터에 대한 접근이 어떤 순서에 따라 이뤄졌는지에 따라 그 실행 결과가 같지 않고 달라지는 상황을 말한다.
- 즉, 두 개의 쓰레드가 하나의 자원을 놓고 서로 사용하려고 경쟁하는 상황을 일컫는다.
이와 관련된 운영체제에서의 해결 방법들은 아래 Reference를 통해 참고해 학습하면 된다.
[운영체제] Race Condition과 예방할 방법(세마포어, 뮤텍스)
Race Condition 해결 방법 → 해결 방법이 동시성 제어임
- Synchronized
-
Synchronized를 메소드에 명시해주면 하나의 스레드만 접근이 가능하다.
-
멀티스레드 환경에서 스레드간 데이터 동기화를 시켜주기 위해서 자바에서 제공하는 키워드이다.
-
Java에서 지원하는 synchronized는, 현재 데이터를 사용하고 있는 해당 스레드를 제외하고 나머지 스레드들은 데이터 접근을 막아 순차적으로 데이터에 접근할 수 있도록 해준다.

1-1 Synchronized의 문제점
- Java의 Sychronized는 하나의 프로세스 안에서만 보장이 된다.