본문 바로가기
java/개념

스레드 동기화(Thread Synchronization)

by unhyepnhj 2024. 11. 28.

스레드 동기화 필요성

 

멀티스레드는 여러 작업을 동시에 실행하는 응용프로그램 작성 기법이다. 이때 다수의 스레드가 공유 자원이나 공유 데이터에 동시에 접근하는 경우 여러 스레드의 출력값들이 뒤섞여 표시되는 등 예상치 못한 문제가 발생할 수 있다.

좌-동시 접근, 우-따로 접근

 

따라서 멀티스레드 프로그램을 작성할 때는 다수의 스레드가 공유 데이터에 접근하는 경우에 대한 처리를 해 주어야 하며, 이것이 스레드 동기화(Thread Synchronization)이다.

 

스레드 동기화는 공유 데이터에 접근하려는 다수의 스레드가 순서대로 충돌 없이 배타적으로 공유 데이터에 접근하기 위해 상호 협력(cooperate)하는 것이다. 공유 데이터에 대한 접근은 배타적이고 독점적으로 이루어져야 하며, 공유 데이터를 독점적으로 다루는 프로그램 코드를 임계 영역(critical section)이라 한다.

 

스레드 동기화를 위해 synchronized로 동기화 블록을 지정하거나 wait()-notify() 메소드로 스레드 실행 순서를 제어할 수 있다.


자바의 스레드 동기화를 위한 synchronized 키워드

 

스레드가 공유 데이터에 접근할 때, 하나씩 순차적으로 실행하게끔 제어하는 기법이다. 한 스레드가 공유 데이터에 접근한 순간 해당 데이터를 잠가(lock) 다른 스레드가 접근하지 못하고 대기하도록 한다.

 

synchronized 키워드는 스레드 동기화를 위한 장치로서, 임의의 코드 블록을 동기화가 설정된 임계 영역으로 지정한다. 이를 위해 synchronized 키워드로 하나의 메소드 전체를 임계 영역으로 지정하는 방법과, 임의의 코드 블록을 임계 영역으로 설정하는 2가지 방법이 존재한다. 2가지 경우 둘 다에서 synchronized 블록에 진입할 때 lock되고, synchronized 블록에서 빠져나올 때 unlock되는 동작이 자동으로 이루어지도록 컴파일된다. 따라서 먼저 synchronized 블록에 진입하는 스레드가 lock 또는 monitor(연관된 객체나 코드를 독점적으로 사용할 수 있는 권한)를 소유하며, 다른 스레드는 synchronized 블록 앞에서 lock을 소유할 때까지 대기한다.

 

1. 메소드 전체를 임계 영역으로 지정

메소드 선언 시 synchronized 키워드를 사용하면 해당 메소드 전체를 임계 영역으로 지정할 수 있다.

synchronized void add(){
	int n = getCurrentSum();	//현재 합
    n += 10
    setCurrentSum(n);
}

add() 메소드는 호출과 동시에 자동으로 동기화된다. 한 스레드가 add()를 호출하여 실행하는 중에 다른 스레드가 add()를 호출하면, 나중에 호출한 스레드는 첫 번째 스레드가 add()의 실행을 마칠 때까지 자동으로 대기한다.

 

2. 코드 블록을 임계 영역으로 지정

중괄호를 이용하여 코드 블록을 synchronized로 지정할 수 있다.

void execute(){
	...
    synchronized(this){
    	int n = getCurrentSum();
        n += 10;
        setCurrentSum();
    }
    ...
}

한 스레드가 synchronized 블록 내의 코드를 실행하고 있을 때 다른 스레드가 이 블록을 실행하고자 하면, 먼저 실행 중인 스레드가 임계 영역의 실행을 마칠 때까지 자동으로 대기한다. 이때 synchronized(this)는 synchronized 블록에서 인자로 주어진 객체와 연계된 lock을 사용하도록 개발자가 지정한 것이다. 개발자는 this 대신 다른 객체의 레퍼런스를 사용할 수 있으며, 이때 해당 객체가 lock과 연관된다.

'java > 개념' 카테고리의 다른 글

스레드 종료  (0) 2024.11.28
스레드 생명 주기와 스케줄링  (0) 2024.11.28
스레드 만들기  (0) 2024.11.19
자바의 멀티스레딩  (0) 2024.11.19
멀티태스킹  (0) 2024.11.19