• Thread Stnchronization
• 공유 데이터에 대한 멀티스레드의 동시 접근 문제의 해결책
-> 한 스레드의 공유 데이터 작업이 끝날 때까지 다른 스레드는 대기
• 다수의 스레드가 공유 데이터를 배타적으로 접근하기 위해 상호 협력하는 것
※ 다수의 스레드가 공유 데이터에 동시에 접근할 경우 예상치 못한 결과가 발생할 수 있다.
• 한 스레드가 독점적으로 실행해야 하는 동기화 코드를 표시
• 메소드 전체 또는 코드 블록에 사용
먼저 실행한 스레드가 해당 객체를 독점적으로 사용하는 권한을 소유
먼저 실행한 스레드가 사용 권한을 포기할 때까지 다른 스레드들은 대기한다.
class Board { // 공유 데이터 역할의 Board
private int sum = 0;
synchronized public void add() {
int n = sum;
Thread.yield(); // 현재 실행 중인 스레드 양보
n += 10;
sum = n; // 증가한 값 sum에 대입
System.out.println(Thread.currentThread().getName() + " : " + sum);
}
public int getSum() {
return sum;
}
}
class PersonThread extends Thread {
private Board board;
public PersonThread(String name, Board board) {
super(name);
this.board = board;
}
@Override
public void run() {
for(int i=0; i<5; i++) {
board.add();
}
}
}
public class ThreadSyncEx {
public static void main(String[] args) {
Board board = new Board();
// 사람1과 사람2가 board를 같이 사용
// 사람1, 사람2가 각각 5번씩 add() 메소드를 호출
Thread thread1 = new PersonThread("사람1", board);
Thread thread2 = new PersonThread("사람2", board);
thread1.start(); // thread1 시작
thread2.start(); // thread2 시작
}
}
• 실행 결과
사람1 : 10
사람1 : 20
사람1 : 30
사람1 : 40
사람1 : 50
사람2 : 60
사람2 : 70
사람2 : 80
사람2 : 90
사람2 : 100
• 동기화 객체 : 두 개 이상의 스레드의 동기화에 사용되는 객체
• Object 메소드이다.
-> 모든 객체가 동기화 객체로 가능
-> Thread 객체도 동기화 객체로 사용 가능
• wait() : 다른 스레드가 notify()를 호출할 때까지 대기
• notify() : 대기 중인 스레드를 RUNNABLE 상태로 만든다. 한 개의 스레드만 깨움
• notifyAll() : 대기 중인 모든 스레드를 RUNNABLE 상태로 만든다. (synchronized 블록 내에서만 사용)