728x90
반응형
자바 동시성 프레임워크에는 모든 기본 타입을 덮어씌우는 AtomicInteger, AtomicBoolean 같은 Atomic 클래스들과 참조 타입에 대한 AtomicReference클래스가 추가되었다.
이 클래스들은 모두 원자(atomic)연산을 보장한다.
AtomicInteger를 사용하면 동기화된 블록은 더 이상 필요하지 않다. AtomicInteger클래스가 값을 읽고 쓰는 동안 변경되지 않는다는 걸 보장해주기 때문이다.
public class SharedState {
@Test
public void sharedState(){
final ExecutorService executorService = Executors.newCachedThreadPool();
final AtomicCounter counter = new AtomicCounter();
executorService.execute(new CounterSetter(counter));
final int value = counter.getNumber().incrementAndGet();
assertEquals(1, value);
}
private static class CounterSetter implements Runnable{
private final AtomicCounter counter;
public CounterSetter(AtomicCounter counter) {
this.counter = counter;
}
@Override
public void run() {
while(true){
counter.getNumber().set(0);
}
}
}
public class AtomicCounter{
private final AtomicInteger number = new AtomicInteger(0);
public AtomicInteger getNumber(){
return number;
}
}
}
증가와 감소 연산자 이용하기
x++ 가 컴파일됨을 인식하면 바이트 코드는 메모리에 저장된 x값을 가져오고, 1을 더하고, x를 다시 메모리에 저장하는 세가지 연산을 한다.
이때 JVM은 세 가지 연산을 실행하는 도중에 스레드 실행을 방해할 수 있으므로 전환된 스레드 또한 x 값을 변경할 수 있다. 이 경우 JVM이 전환된 스레드를 선택하면 메모리에 다시 저장되는 값은 유효하지 않게 되고, 스레드 실행을 방해했던 스레드에 이상이 발생한다.
728x90
반응형
'그 외 ... (정리해야함) > 질문과 답변' 카테고리의 다른 글
템플릿 메서드 패턴은 어떻게 사용하는가? (0) | 2019.05.11 |
---|---|
[동시성] 스레드 사이의 공유 상태는 어떻게 관리하는가? (0) | 2019.05.07 |
JVM에서 동작하는 실제 자바 코드를 작성할 때 생명주기란 무엇인가? (0) | 2019.05.07 |
JVM의 힙 크기는 어떻게 지정할 수 있는가? (0) | 2019.05.07 |
JVM 메모리는 어떻게 할당되는가? (0) | 2019.05.05 |