minuco
article thumbnail
반응형

동기화 메서드

지난 시간에는 스레드 A를 사용하는 중 스레드 B를 사용하면 스레드 B가 스레드 A의 상태를 변경시켜버려 의도하지 않았던 결과를 얻었는데요, 이를 방지하기 위한 방법을 알아보겠습니다!

 

스레드가 사용 중인 객체를 다른 스레드가 변경할 수 없게  하려면 스레드 작업이 끝날 때까지 객체에 잠금을 걸어서 다른 스레드가 사용할 수 없도록 해야 합니다.

 

멀티 스레드에서 단 하나의 영역을 실행할 수 있는 영역을 임계 영역이라 하는데 자바는 임계 영역을 지정하기 위해 동기화 메서드를 제공합니다.

 

내부의 동기화 메서드를 실행하면 즉시 객체에서 잠금을 걸어 다른 스레드가 동기화 매소드를 실행하지 못하게 해요! 그 방법을 설명드리겠습니다.

 

동기화 메서드를 만들려면 메서드 선언부에 synchronized 키워드를 붙이면 되는데, 인스턴스와 정적 메서드 어디든 붙일 수 있습니다.

public synchronized void method(){
	임계영역; // 단 하나의 스레드만 실행
}

동기화 메서드는 전체 영역이 임계 영역이다. 스레드가 동기화 메서드를 실행하는즉 시 객체에 잠금이 일어나고, 스레드가 동기화 메서드를 종료하면 잠금이 풀린다.

 

동기화 메서드가 여러 개 있을 경우, 스레드가 이 중 하나를 실행할 때 다른 스레드는 동기화 메서드를 실행할 수 없습니다.

하지만 이때 다른 스레드에서 일반 메서드는 실행이 가능합니다.

오늘의 예제는 지난 시간의 예제에서 문제가 되었던 Calculator를 수정한 것입니다.

setMemory() 메서드를 동기화 메서드로 만들어 User1 스레드가 setMemory()를 실행하는 동안 User2 스레드가 setMemory()를 실행할 수 없도록 했습니다.

 

밑의 코드는 지난 시간의 예제에서 Calculator 메서드를 수정한 것인데요, 예제를 따라 치고 싶으신 분들은 동기화 메서드 (1) 에서 순서대로 코드를 작성 후 Calculator class의 코드들을 밑의 코드로 수정해주시기 바랍니다.

public class Calculator {
    private int memory;

    public int getMemory(){
        return memory;
    }

    // 예제 2 synchronized 적용
    public synchronized void setMemory(int memory){
        this.memory = memory; // 메개값을 memory 필드에 저장
        try {
            Thread.sleep(2000); // 스레드를 2초간 일시 정지됨
        } catch (InterruptedException e){}
        System.out.println(Thread.currentThread().getName() + ": "+ this.memory);
        // Thread.currentThread().getName() -> 메모리 이름얻기
        // this.memory -> 메모리
    }
}

MainThreadExample.java를 다시 실행시켜 보면 User1은 100, User2는 50이라는 출력 값을 얻을 수 있습니다.

User1 스레드는 Calculator 객체의 동기화 메서드인 setMemory()를 실행하는 순간 객체를 잠금 처리합니다.

메인 스레드가 User2 스레드를 실행하지만, 동기화 메서드인 setMemory()를 실행하지 못하고 User1이 setMemory()를 실행할 동안 대기해야 합니다.

 


여기까지 스레드의 기본적인 개념과 사용법을 알아보았는데요.

다음 시간에는 스레드를 제어할 수 있는 방법에 대해서 공부해 볼게요!

 

참조 : 혼자 공부하는 자바, 신용권

반응형

'Android > java' 카테고리의 다른 글

Java 기초개념 (컴파일, 실행)  (0) 2021.02.27
스레드 (Thread) - 제어  (0) 2021.02.26
스레드 (Thread) - 동기화 메소드 (1)  (0) 2021.02.23
스레드 (Thread) 하위클래스  (0) 2021.02.21
스레드 (Thread) 란?  (0) 2021.02.18
profile

minuco

@minuco

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!