본 포스팅은 [이것이 자바다]의 내용을 참고하여 작성하였습니다.
12.4.1 공유 객체를 사용할 때의 주의할 점
멀티 스레드 프로그램에서는 스레드들이 객체를 공유해서 작업해야 하는 경우가 있음.
ex) 스레드 A가 사용하던 객체가 스레드 B에 의해 변경될 수 있기 때문에 A가 의도한 것과 다른 결과 산출.
12.4.2 동기화 메소드 및 동기화 블록
따라서 스레드가 사용 중인 객체를 다른 스레드가 변경할 수 없도록 하려면, 객체에 잠금을 걸어서 다른 스레드를 사용하지 못하게 해야 한다.
객체에 잠금을 걸기 위해 자바는 동기화(synchronized) 메소드와 동기화 블록을 제공한다.
스레드가 객체 내부의 동기화 메소드 또는 블록에 들어가면 즉시 객체에 잠금을 걸어 다른 스레드가 *임계 영역 코드를 실행하지 못하도록 한다. 동기화 메소드는 다음과 같이 메소드 선언 시 synchronized 키워드를 붙여 만들 수 있다.
public synchronized void method () {
임계 영역; //단 하나의 스레드만 실행
}
*임계 영역(critical section): 멀티 스레드 프로그램에서 단 하나의 스레드만 실행할 수 있는 코드 영역
일부 내용만 임계 영역으로 만들고 싶다면 다음과 같이 동기화 블록을 만들면 된다.
public void method () {
//여러 스레드가 실행 가능 영역
...
synchronized(공유객체) {
임계 영역 //단 하나의 스레드만 실행
}
//여러 스레드가 실행 가능 영역
...
}
동기화 블록의 외부 코드들은 여러 스레드가 동시에 실행할 수 있지만, 동기화 블록의 내부 코드는 한번에 한 스레드만 실행할 수 있고 다른 스레드는 실행할 수 없다.
만약 동기화 메소드와 동기화 블록이 여러 개 있을 경우, 스레드가 이들 중 하나를 실행할 때 다른 스레드는 해당 메소드를 포함해 다른 동기화 메소드 및 블록을 실행할 수 없다. (단, 일반 메소드는 실행 가능)
'Study in SSAFY > 이것이 자바다' 카테고리의 다른 글
[이것이 자바다] 12.6 멀티스레드 - 스레드 상태 제어 (0) | 2022.09.12 |
---|---|
[이것이 자바다] 12.5 멀티스레드 - 스레드 상태 (0) | 2022.09.12 |
[이것이 자바다] 11. 기본 API 클래스(Math~Formatting) (0) | 2022.08.10 |
[이것이 자바다] 10. 예외 처리 (0) | 2022.07.31 |
[이것이 자바다] 02. 변수와 타입 (0) | 2022.07.27 |