[Java] Thread#3, 스레드 동기화 메소드, 동기화 블럭

공유 객체 사용시

- 싱글 스레드의 경우는 고민할 경우가 거의 없다.

- 멀티 스레드의 경우 스레드간의 하나의 객체 공유 시 디버깅하기 어려운 오류가 나타날 수 있다.

 

Tread-1이 공유객체의 멤버변수에 할당된 값을 변경. -> 그사이 Thread-2가 공유 객체의 멤버변수에 할당된 값을(null이 아닌지 모르고) 엎어침. -> Thread-1 공유객체 사용하려는데 값이바뀜. -> 오류!!

이를 방지하기 위해 단 하나의 스레드만을 실행할 수 있는 임계영역을 지정해야 한다. 즉, 객체에 잠금을 걸어두어 하나의 스레드만이 접근가능하고 나머지 스레드는 대기하도록 만든다.

 

키워드 : synchronized

 

동기화(synchronized) 메소드
public synchronized void method(){
	//임계영역; 단하나의 스레드만 실행가능.
}
package sync;

public class Calculator {
	private int memory;
	
	public int getMemory() {
		return memory;
	}
	//동기화 메소드로 선언하는 방법
	public synchronized void setMemory(int memory) { 
		this.memory = memory;
		try {
			Thread.sleep(2000);
		}catch(InterruptedException e) {}
		System.out.println(Thread.currentThread().getName()+" : "+this.memory);
	}
}

- setMemory 메소드는 하나의 스레드만이 실행 가능한 메소드

 

동기화(synchronized) 블럭
public void method(){
	synchronized (공유객체){
    	//임계영역(단 하나의 스레드만 실행 가능)
    }
    //여러 스레드가 실행 가능한 영역.
}
package sync;

public class Calculator {
	private int memory;
	
	public int getMemory() {
		return memory;
	}
	
	// 이렇게 동기화 블럭을 사용해서 처리할 수 있다.
	public void setMemory(int memory) {
		synchronized (this) {
			this.memory = memory;
			try {
				Thread.sleep(2000);
			}catch(InterruptedException e) {}
			System.out.println(Thread.currentThread().getName()+" : "+this.memory);
		}
	}
}

 

댓글

Designed by JB FACTORY