본문 바로가기

Programming/JAVA

멀티 스레드(4) - 동기화 메서드와 동기화 블록 1

JAVA logo image

 

 

 

 

공유객체라는 개념을 이제부터 설명해 보겠습니다. 싱글 스레드일 경우에는 한 개의 스레드가 객체를 단독으로 사용하기 때문에 큰 이슈가 없습니다. 하지만 멀티 스레드일 경우에는 여러 개의 스레드가 객체를 공유하며 작업하는 경우가 많습니다. 이 때, 하나의 객체를 스레드 A가 사용하는데 도중에 스레드 B에 의해 상태가 변경될 수도 있습니다. 결국, 이럴 경우에는 스레드 A가 의도했던 방향과 다른 결과가 발생할 수도 있습니다(누군가 쓰던 계산기 프로그램을 다른 사람이 와서 만지는 상황과 비슷하죠).

 

예를 들어, User1 스레드가 Cacluator 객체 안의 memory 필드에 100을 저장하고 바로 2초간 일시 정지 상태가 되었습니다. 그런데, 그 사이에 User2 스레드가 memory 필드 값을 50으로 변경하고 2초간 일시 정지 상태가 되었습니다. 다시 실행 상태가 된 User1이 memory를 출력하면, 50이 출력됩니다. 

 

아래 예제에서 공유객체 Calculator / User1 / User2 / 실행 코드를 작성해 보겠습니다. 

 

 

 

 


 

 

// Calculator.java
public class Calculator {
	private int memory;
	
	public int getMemory() {
		return memory;
	}
	
	public void setMemory(int memory) {
		this.memory = memory;
		try {
			Thread.sleep(2000);
		} catch(InterruptedException e) {}
		System.out.println(Thread.currentThread().getName() + ": " + this.memory);
	}
}

 

 

// User1.java
public class User1 extends Thread {
	private Calculator calculator;
	
	public void setCalculator(Calculator calculator) {
		this.setName("User1");
		this.calculator = calculator;
	}
	
	public void run() {
		calculator.setMemory(100);
	}
}

 

// User2.java
public class User2 extends Thread {
	private Calculator calculator;
	
	public void setCalculator(Calculator calculator) {
		this.setName("User2");
		this.calculator = calculator;
	}
	
	public void run() {
		calculator.setMemory(50);
	}
}

/* 출력
User1: 50
User2: 50
*/