라이브러리를 이해하라
<aside> 💡 스레드를 차단하지 않는 방법(non-blocking)
</aside>
최신 프로세서는 차단하지 않고도 안정적으로 값을 갱신한다
→ 현대 프로세서는 흔히 CAS (Compare And Swap) 연산을 지원한다
<aside> 💡 메서드가 공유 변수를 갱신하려 든다면, CAS 연산은 현재 변수 값이 최종으로 알려진 값인지 확인한다. (이미 갱신된) 값을 변경하려던 메서더는 값이 변경되지 않았다는 사실을 확인하고 다시 시도한다.
</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;
}
}
→ 문제를 해결하는 방안은 세 가지다