Youn's IT Memo
Class 동기화 기법 ( mutex exclusion ) 본문
Summary
오늘 CS 관련 영상을 여러개 보다가 Mutex와 Semaphore 관련된 영상을 보게 되었습니다.
대학교 시절에 운영체제 수업을 들을때 배웠지만 다시 새롭게 들으면서 잊고 있던 부분을 상기시킬수
있었던 좋은 시간이었습니다. 그래서 제가 쓰는 자바에서는 어떻게 동기화 로직을 어떻게 지원하는지
궁금해졌습니다. 따라서 오늘은 Oracle Docs를 통해 자바에서 어떻게 지원하는지 살펴보고 정리해보겠습니다.
Oracle Docs Url
https://docs.oracle.com/javase/specs/jls/se8/html/jls-17.html#jls-17.4
Chapter 17. Threads and Locks
class A { final int x; A() { x = 1; } int f() { return d(this,this); } int d(A a1, A a2) { int i = a1.x; g(a1); int j = a2.x; return j - i; } static void g(A a) { // uses reflection to change a.x to 2 } } In the d method, the compiler is allowed to reorder
docs.oracle.com
동기화 기법
멀티 스레드 환경에서는 동기화 문제는 항상 마주할수 밖에 없습니다.
이를 해결하기 위해 아래와 같은 조건들이 필요합니다
- 상호 배제 ( Mutual Exclusion )
- 동시에 2개 이상 스레드는 접근이 불가합니다.
- 진행 ( Progress )
- 사용 중인 프로세스가 없다면 어떤 프로세스라도 접근이 가능합니다.
- 한정 대기 ( Bounded waiting )
- 자원을 요청한 스레드는 무한정 대기하지 않습니다.
위 조건을 지원하는 기법은 스핀락 , 뮤택스, 세마포어 , 모니터 등이 있습니다.
간단하게 코드 예제를 보고 넘어가도록 하겠습니다.
import java.util.concurrent.locks.ReentrantLock;
class Counter {
private int count = 0;
private final Lock lock = new ReentrantLock(true);
public void increment() {
// 락을 얻을때까지 Wait 합니다.
lock.lock();
try {
count++;
} finally {
// 완료 후 락을 반환합니다.
lock.unlock();
}
}
public int getCount() {
return count;
}
}
public static void main(String[] args) {
Counter counter = new Counter();
Thread t1 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
counter.increment();
}
});
Thread t2 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
counter.increment();
}
});
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException ignore) {}
System.out.println(counter.getCount()); // 2000
}
모니터
이제 Docs를 살펴보겠습니다. 문서에서는 스레드 간의 동기화를 위해 기본적으로 모니터를 사용하여 지원합니다.

Java의 객체들은 Lock, Unlock 이 가능한 모니터를 지원합니다.

객체는 다음과 같은 상태메소드를 지원합니다
- Object.wait() : 해당 스레드를 대기상태로 전환합니다
- Object.notify() : unlock , signal을 뜻하며 대기 Queue에 있는 자원을 꺼내도록 요청합니다.
- Object.notifyAll() : 대기 Queue에 있는 모든 객체를 꺼내도록 지원합니다

wait, notify시 중단시 상호작용에 대한 속성을 지원합니다.
- 스레드가 wait 중 알림을 받고 Interrupt 되는 경우
- 기다리고 있는 Interrupt가 있는 경우 정상적으로 wait 반환
- InterruptedException 를 발생

'Language > Java' 카테고리의 다른 글
| JEP 430. String 템플릿 (Preview) (0) | 2023.09.02 |
|---|---|
| Java 실험 | Comparator & Auto Boxing (0) | 2023.06.22 |