본문 바로가기

Java 공부

12장 동기화 메소드와 동기화 블록

공유 객체를 사용하면 문제점이 발생한다.


User1스레드와 User2스레드가 Calculator라는 객체를 함께 사용하게 된다면 문제점이 발생한다.

User1스레드가 Calculator객체의 memory필드에 100이라는 값을 저장하고 2초간 일시정지 상태에 있는다.

이때 User2스레드가 실행을 하면서 memory필드의 값을 50으로 변경한다. 그리고 2초간 일시정지 상태에 있는다.

정지상태가 끝난 User1스레드가 Calculator객체 안에 있는 memory값을 출력하게 되면 출력값은 50이 된다.

이는 엉뚱한 값이 출력되는 것이다.


이렇게 공유객체를 사용하면서 발생하는 문제점을 개선하기 위해서 동기화 메소드동기화 블록을 사용할 수 있다.


동기화 메소드 및 동기화 블록 - synchronized

-단 하나의 스레드만 실행할 수 있는 메소드 또는 블록을 말한다.

-다른 스레드는 메소드나 블록이 실행이 끝날 때까지 대기해야 한다.


동기화 메소드

public synchronized void method() {

* 임계 영역: 단 하나의 스레드만 실행

}


동기화 블록   : 메소드 안에 동기화 블록이 들어가 있는 상태

public void method () {

//여러 스레드가 실행 가능 영역

...

synchronized (공유객체) {

* 임계 영역: 단 하나의 스레드만 실행

}

//여러 스레드가 실행 가능 영역

...

}


-> T1, T2가 있다고 가정하면 T1이 먼저 싱크로나이즈 블록에 들어가게 되면 T2는 T1이 싱크로나이즈 블록을 다 실행할 때까지 

    대기 상태에 있게 된다. T1의 실행이 끝나면 T2가 싱크로나이즈 블록을 실행할 수 있다.

    즉, T1이 동기화 메소드 또는 동기화 블록을 실행하고 있다면 T2는 모든 동기화 메소드, 블록을 실행할 수 없고, 일반 메소드만 실행할 수 있다.




본 포스팅은 이것이 자바다 책을 참고하여 작성하였습니다.

'Java 공부' 카테고리의 다른 글

12장 스레드 상태 제어(1)  (0) 2018.12.03
12장 스레드 상태  (0) 2018.12.03
12장 스레드 우선순위  (0) 2018.12.02
12장 작업 스레드 생성과 실행  (0) 2018.12.02
11장 API정리_String클래스  (0) 2018.12.01