스레드 동기화
- 하나의 스레드로 동작하는 프로그램은 각각의 객체를 생성해서 사용하게 되므로 문제가 없었다.
- 멀티스레드 환경에서는 여러 스레드가 하나의 객체를 사용하는 경우가 생김!
=> 각 스레드에서 해당 객체의 필드 값을 변경하게 되면 의도대로 프로그램이 실행되지 않는다.
- 스레드 동기화(Synchronized)
: 하나의 스레드가 모든 작업이 끝날 때까지 다른 스레드가 해당 객체의 값을 변경하지 못하도록 하는 것.
동기화 지정 방법
synchronized 메서드명() {
...
}
synchronized (thi s) {
...
}
동기화 예제
public class Calc {
int total = 0;
// 동기화 메서드
/*
syschronized public void sum() { // 메서드 앞에 synchronized 삽입
for(int i = 0; i <= 100; i++) {
total += i;
System.out.println(Thread.currentThread().getName() + " : " + total);
}
}
*/
// 동기화 블록
public void sum() { // 메서드 안에 sysnchronized(this) { } 삽입
syschronized(this) {
for(int i = 0; i <= 100; i++) {
total += i;
System.out.println(Thread.currentThread().getName() + " : " + total);
}
}
}
}
public class ThreadEx extends Thread {
Calc calc;
ThreadEx(String name, Calc calc) {
this.setName(name);
this.calc = calc;
}
public void run() {
calc.sum(); => 1~100까지 더하는 메서드
}
}
public class ThreadMain {
public stataic void main(String args[]) {
Calc calc = new Calc();
ThreadEx t1 = new ThreadEx("t1", calc);
ThreadEx t2 = new ThreadEx("t2", calc);
}
}
t1 : 1
t1 : 3
t1 : 6
...
t1 : 5050
t2 : 1
t2 : 3
t2 : 6
...
t2 : 5050