[Java] Thread#3, 스레드 동기화 메소드, 동기화 블럭
- 프로그래밍 언어/Java
- 2019. 9. 3. 08:48
공유 객체 사용시
- 싱글 스레드의 경우는 고민할 경우가 거의 없다.
- 멀티 스레드의 경우 스레드간의 하나의 객체 공유 시 디버깅하기 어려운 오류가 나타날 수 있다.
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);
}
}
}
'프로그래밍 언어 > Java' 카테고리의 다른 글
[Java] Thread#5, 스레드 그룹 개념 및 예제 (0) | 2019.09.07 |
---|---|
[Java] Thread#4, 스레드의 상태제어 메소드 및 데몬 스레드 개념 및 예제 (0) | 2019.09.05 |
[Java] Thread#2, 스레드의 우선순위 개념 및 예제 (1) | 2019.09.02 |
[Java] Thread#1, 스레드의 개념 및 기본 예제 (1) | 2019.09.02 |
[Java] 자바, 가비지 컬렉터(Garbage Collector) (0) | 2019.04.21 |