동기화 (synchronization)
- 멀티스레드 프로그램이 실행될 때, 다수의 스레드가 공유 데이터를 동시에 접근하는 경우가 발생한다.
- 특히 다수의 스레드가 동시에 공유 데이터의 값을 변경시키는 경우에는 공유 데이터의 값이 정상적으로 변경되지 않는다.
- 이것은 마치 여러 사람이 볼 일을 보려고 한 칸의 화장실에 동시에 들어가는 경우와 같다.
- 공유 데이터를 동시 접근하는 여러 스레드에 의해 공유 데이터의 값이 비정상적으로 유지되지 않도록 스레드의 실행을 제어하는 기술을 스레드 동기화(thread synchronization)라고 부른다.
- 스레드를 동기화하는 방법
방법 1 : synchronized로 동기화 블럭 지정
방법 2 : wait()-notify() 메서드로 스레드 실행순서를 제어
synchronized로 동기화 블럭 지정
- 동기화된 메소드를 만들기 위해서는 synchronized키워드를 메소드 선언에 붙이면 된다.
- synchronized 키워드가 붙어 있으면 하나의 스레드가 공유 메소드를 실행하는 동안에 다른 스레드는 공유 메소드를 실행할 수 없다.
Class Counter {
private int value=0;
public synchronized void increment() { value++; } //공유 데이터를 조작하는 메소드 앞에 synchronized를 붙인다.
public synchronized void deccrement() { value--; }
public synchronized void printCounter() { System.out.println(value); }
}
synchronized로 동기화 블럭 지정
- synchronized를 사용하면 하나의 스레드가 진입하면 스레드 작업이 끝날때까지 다른 스레드는 진입할 수 없다.
>>동기화_방법1
wait()-notify() 메서드로 스레드 실행순서를 제어
- Object 클래스의 메서드로서 synchronized에서만 사용 가능하다.
- synchronized 키워드를 이용해 공유된 객체의 자원을 하나의 스레드에서만 사용할 수 있게 락(lock)상태를 만들면 다른 스레드에서도 사용할 수 있게 만들기 위해 스레드간의 통신이 필요하다.
- 이 때 자원을 점유하고 있던 동기화된 스레드가 wait() 메서드를 호출하면 락 상태의 자원을 더이상 사용하지 않고 대기 상태에 들어가고, notity메서드를 호출하면 다른 스레드에게 락 상태에 자원이 사용 가능함을 알리게 하여 다른 스레드들을 대기상태에서 자원을 사용 할 수있는 준비상태로 깨우게 된다.
>>동기화_방법2
'Web Programming > java-jsp' 카테고리의 다른 글
java 선택 정렬(Selection Sort) (0) | 2018.08.29 |
---|---|
java 면접 예상 질문 (0) | 2018.08.29 |
java 스레드, Runnable 인터페이스, 싱글스레드, 멀티스레드, join메서드, sleep메서드 (0) | 2018.08.29 |
java 다형성, instanceof, 객체의타입, 상향형변환 (0) | 2018.08.29 |
java 인터페이스, 추상클래스, 다중상속 (0) | 2018.08.29 |