단순한 x++
은 원자 연산이 아니지만 사실은 읽기 - 증가 - 쓰기 연산임을 알 수 있습니다. 그것이 동기화되어야하는 이유입니다. 그러나 get()
은 어떨까요? 나는 그것도 동기화되어야 읽었지만, 누군가가 왜 나에게 설명 할 수 있을까? happens-before
관계를 도입하여 메모리 일관성 오류를 피하려면? get()
이 여러 스레드에서 자주 호출되고 값이 거의 변경되지 않는 경우는 어떻습니까? synchronized get()
그들을 느리게하고 있지 않습니까? 이 시나리오에서 AtomicInteger를 사용하지 않고 다른 방법으로 동기화를 수행 할 수 있습니까? volatile
여기에서 키워드를 사용할 수 있습니까?자바 동기화 된 카운터 - get()은 어떻습니까?
public class Counter {
private int value;
public synchronized int get() { return value; }
public synchronized int increment() { return ++value; }
public synchronized int decrement() { return --value; }
}
감사합니다.
편집 :
나는 분명히하고 싶습니다. volatile
을 사용하여 synchronized
을 제거하고 get()
방법에서 해당 키워드를 소개한다는 의미였습니다. 많은 스레드가 값을 읽는 중이고 거의 변경하지 않으면 스레드가 안전 할뿐만 아니라 더 효율적인지 궁금합니다.
필자는 AtomicInteger를 사용하지 않는 것과 동일한 동작을 얻으려고했다. P 'volatile '을 사용하여 키워드를 도입하고'get()'메소드에서'synchronized'를 제거했다. 많은 스레드가 값을 읽고 거의 변경하지 않으면 스레드가 안전 할뿐만 아니라 더 효율적인지 궁금합니다. –
예 @JakubKrawczyk, 작동합니다. 'AtomicInteger'보다 더 빨라지려고하십니까? 왜 그 수업을 사용하지 않습니까? 이것이 효율성을위한 것이라면 조기 최적화의 정의를 수행하고 있습니다. – Gray
나는 내 자신의'AtomicInteger'를 구현하려고하지 않고있다. :) 나는 그 문제에서 동기화를 이해하려고 애쓰는 중이었다. 확실한 대답은 "AtomicInteger' 사용"이라고 생각하고 피하고 싶었습니다 : P 작동하지 않았습니다;) 감사합니다! –