18장 동시성2 (420 ~ 428)

라이브러리를 이해하라

<aside> 💡 스레드를 차단하지 않는 방법(non-blocking)

</aside>

<aside> 💡 메서드 사이에 존재하는 의존성을 조심하라

</aside>

public class IntegerIterator implements Iterator<Integer> {
	private Integer nextValue = 0;

	public synchronized boolean hasNext() {
		return nextValue < 100000;
	}
	public synchronized Integer next() {
		if (nextValue == 100000)
			throw new IteratorPastEndException();
		return nextValue++;
	}
	public synchronied Integer getNextValue(){
		return nextValue;
	}
}

→ 문제를 해결하는 방안은 세 가지다

  1. 실패를 용인한다 (클라이언트가 예외를 받아 처리한다)
  2. 클라이언트-기반 잠금 (서버를 사용하는 모든 프로그래머가 락을 기억해 객체어 걸었다 풀어야하므로 위험하다)
  3. 서버-기반 잠금