알버트의 개발하는 블로그

자바 제20강 : 자바 스레드 동기화 (Thread synchronization) 본문

프로그래밍 언어/Java

자바 제20강 : 자바 스레드 동기화 (Thread synchronization)

알버트 2021. 9. 10. 10:29

 

이번 시간에는 자바 스레드에서 제공하는 중요한 기능중에 하나인 동기화에 대해서 알아보겠습니다.

스레드라는 것은, 프로세스에서 실행되는 가장 작은 실행단위인데요. 이 스레드들이 공유된 데이터를 사용해야 할 때가 있습니다. 근데 두 스레드가 공유된 데이터를 처리하다 보면 생각치 못한 오류가 발생할 수 있습니다. 그래서 동기화라는 것은, 이 스레드들이 공유 데이터를 누가 먼저 작업할지 순서를 정해줍니다.

 

 

즉, 공유 영역을 사용하는 스레드가 실행중일 때 같은 공유 데이터를 사용하는 다른 스레드가 실행되지 못하도록 하는 것을 말합니다. 순서를 정해주는 것입니다. 따라서 동기화 블록에는 실행중에 절대로 작업 전환이 이루어지면 안되는 내용을 코딩해주어야 합니다.

 

 

 


 

 

스레드 동기화 주요 메소드

 

wait() : 다른 스레드가 실행되는 동안 이 메소드가 실행된 메소드는 잠시 대기한다.

notify() : wait() 메소드로 잠깐 중지한 스레드를 다시 실행시킨다.

notifyAll() : wait() 메소드로 잠깐 중지한 모든 스레드를 다시 실행시킨다.

 

이렇게 주요 메소드가 3개 정도 있다고 보시면 됩니다. wait(), notify() 메소드는 반드시 동기화 블록 내부에 코딩해주어야 합니다. 이제 간단한 예제를 통해서 자바 스레드 동기화에 대해서 알아보겠습니다.

 

 

 


 

스레드 동기화 예제

 

먼저 두 개의 스레드가 공유할 데이터가 들어있는 클래스를 선언해주었습니다. 이 프로그래밍에선 원주율을 계산하고 출력하는 프로그램을 짜보았습니다. result는 계산된 원주율을 입력할 변수이고 ready는 계산이 완료되면 알려주는 논리값입니다.

 

 

 

원주율을 실질적으로 계산하는 스레드입니다. 여기서 중요한 구문이 synchronized 블록인데요. ( ) 블록에는 공유데이터 인수를 넣어주어야 합니다. 그리고, 필요한 작업 내용을 적고 wait()인지 notify()인지를 선언해주어야 합니다.

 

 

 

 

 

 

다음으로 계산된 원주율을 출력해주는 스레드입니다. 먼저 계산되지도 않은 원주율을 출력해주면 안되기 때문에 wait()를 동기화 블록에 넣은 것을 알 수 있습니다. 그래서 calculator 스레드가 다 실행이 끝나면 공유데이터인 원주율을 사용하게 됩니다.

 

 

 

 

 

메인 클래스에선 이렇게 객체를 선언하고 두 개의 스레드를 실행해 주었습니다.

 

 

 

짜잔~ 이렇게 컴파일하면 먼저 첫줄을 출력해주고, 계산이 끝나면 print스레드를 통해서 공유데이터인 실행시간과 원주율을 출력해주는 것을 볼 수 있습니다.

 

이처럼, 스레드 동기화는 프로그래밍에 있어서 정말 중요한 개념입니다. 많은 연습을 통해서 숙지하시면 프로그래밍을 더 효율적으로 할 수 있습니다. 읽어주셔서 감사합니다.