[자바 기초] Thread(2) - 동기화와 원자성

쓰레드의 동기화

→ Thread Synchronization

자바에서는

이용하여 구현

synchronized 이용한 동기화 - 임계영역 설정

ThreadEx19

ThreadEx20

  1. 메서드 전체를 임계영역으로 지정 → 해당 메서드를 가진 객체에 lock을 건다. 메서드 종료시 lock 반환
    public synchronized void calcSum() {
    	// ...
    }
  1. 특정 영역을 임계영역으로 지정 - 지정된 객체에 lock을 건다. 블럭 벗어나면 lock 반환
    synchronized (객체의 참조변수){
    	//...
    }

임계영역은 멀티쓰레드 프로그램의 성능을 좌우하므로 가능하면 블럭을 이용해서 효율적인 프로그램을 만들어야한다.

static메서드의 경우 class에 lock을 건다. instance와 다름.

wait(), notify()

ThreadWaitEx1

ThreadWaitEx2

wait() - lock을 반납하고 대기. 다른 쓰레드가 해당 객체에 대한 작업 수행

notify() - 작업을 중단했던 여러 쓰레드 중 하나의 쓰레드가 다시 lock을 얻어 작업을 진행

Lock과 Condition을 이용한 동기화

ThreadWaitEx3

ReentrantLock()

ReentrantLock(boolean fair) ← 가장 오래 기다린 쓰레드를 찾아 실행. 성능은 낮아짐.

lock(), unlock(), isLocked()

    lock.lock();
    try {
    	// 임계영역
    } finally {
    	lock.unlock();
    }

boolean tryLock()

boolean tryLock(long timeout, TimeUnit unit) throws InterruptException

InterruptException - 지정된 시간동안 기다리는 도중 작업 취소될 수 있도록 코드 작성

다른 쓰레드에 의해 lock 걸려 있으면 lock 얻으려고 대기하지 않는다. 또는 지정된 시간 만큼 대기 lock을 얻으면 true, 아니면 false. 응답성 중요한 경우 사용한다.

Condition

volatile

Atomic 클래스

    int compare_and_swap(int* reg, int oldval, int newval) {
      int old_reg_val = *reg;
      if (old_reg_val == oldval)
         *reg = newval;
      return old_reg_val;
    }

TODO: Executor, Callable, Future에 대해 알아보기, 병렬처리에 대해 알아보기