휘발성 부울 vs Atomic Boolean
휘발성 부울로는 달성할 수 없는 Atomic Boolean의 역할은 무엇입니까?
해당 필드가 소유자 스레드에 의해서만 갱신되고 값이 다른 스레드에 의해서만 읽힐 때 휘발성 필드를 사용합니다.여러 옵서버가 존재하지만 퍼블리셔가1개뿐인 경우 퍼블리시/서브스크라이브 시나리오로 생각할 수 있습니다.다만, 이러한 옵서버가 필드의 값에 근거해 로직을 실행해, 새로운 값을 푸시백 할 필요가 있는 경우는, Atomic*의 vars 또는 locks 또는 synchronized blocks(최적의 블록)를 사용합니다.대부분의 동시 시나리오에서는 값을 취득하고 다른 값과 비교하여 필요에 따라 갱신하기 위해 요약됩니다.따라서 compareAndSet 메서드와 getAndSet 메서드는 Atomic* 클래스에 있습니다.
java.util.concurrent.atomic 패키지의 JavaDocs에서 Atomic 클래스의 리스트와 그 동작에 대한 훌륭한 설명을 확인합니다(잠금이 없는 것을 알게 된 지 얼마 안 되어 잠금이나 동기화된 블록보다 유리합니다).
이치노를 생각해 보세요.volatile
★★★★
volatile int i = 0;
void incIBy5() {
i += 5;
}
가 동시에, 「」는 「」를 참조해 주세요.i
가 이와, 5일 경우 할 수 없음) 수, 5일 경우 동기화 할 수 없음).int
void incIBy5() {
int temp;
synchronized(i) { temp = i }
synchronized(i) { i = temp + 5 }
}
변수가 휘발성이 있는 경우 해당 변수에 대한 모든 아토믹접근은 동기화되지만 실제로 아토믹접근으로 인정되는 것이 항상 명확한 것은 아닙니다.를용 an with with with withAtomic*
오브젝트, 모든 메서드가 "원자성"임을 보증합니다.
RSA를 ,AtomicInteger
★★★★★★★★★★★★★★★★★」getAndAdd(int delta)
결과가 꼭 10
가 모두 a를 에는 a를 부정합니다boolean
""를 동시에 합니다.AtomicBoolean
에 '의 값'이 있는 것을 할 수 .volatile boolean
은 할 수 없습니다그럴수는 없어요.
따라서 필드를 수정하는 스레드가 여러 개 있을 때마다 필드를 원자적으로 만들거나 명시적 동기화를 사용해야 합니다.
★★★의 volatile
이 를 들어주세요.
volatile boolean stop = false;
void loop() {
while (!stop) { ... }
}
void stop() { stop = true; }
" " 를 실행하고 loop()
또 있다, 라고 합니다.stop()
'무한 '를 루프 가 될 수 .volatile
첫 번째 스레드가 stop 값을 캐시할 수 있기 때문입니다.에서는, 「」, 「」.volatile
는 컴파일러가 최적화에 좀 더 주의를 기울이도록 하는 힌트입니다.
수 없다compareAndSet
,getAndSet
volatile boolean atomic operation(휘발성 부울)
AtomicBoolean
에는 복합연산을 , 이 가 없습니다.synchronized
block.에.,.,.,.volatile boolean
는, 조작을 할 수 있는 는, 「 할 수 .synchronized
:volatile boolean
, 똑같아요.get
★★★★★★★★★★★★★★★★★」set
의 AtomicBoolean
각각 다음과 같다.
를 들면, 「 」입니다.compareAndSet
로 다음 작업을 합니다(method는 method를 사용하지 않습니다.synchronized
★★★★★
if (value == expectedValue) {
value = newValue;
return true;
} else {
return false;
}
때문에, 「 」는,compareAndSet
method를 사용하면 여러 스레드에서 호출된 경우에도 한 번만 실행이 보장되는 코드를 쓸 수 있습니다.예를 들어 다음과 같습니다.
final AtomicBoolean isJobDone = new AtomicBoolean(false);
...
if (isJobDone.compareAndSet(false, true)) {
listener.notifyJobDone();
}
가 1회만 되어 있지 ).AtomicBoolean
으로 false
로 설정한 후에 다시true
를 참조해 주세요.
volatile
키워드는 변수를 공유하는 스레드 간의 관계를 보증합니다.부울 변수에 액세스하는 동안 두 개 이상의 스레드가 서로 중단되지 않는다는 보장은 없습니다.
휘발성 부울 vs Atomic Boolean
Atomic* 클래스는 같은 유형의 휘발성 프리미티브를 래핑합니다.출처:
public class AtomicLong extends Number implements java.io.Serializable {
...
private volatile long value;
...
public final long get() {
return value;
}
...
public final void set(long newValue) {
value = newValue;
}
따라서 Atomic*을 가져와 설정하는 것만으로 충분하다면 휘발성 필드를 사용할 수 있습니다.
휘발성 부울로는 달성할 수 없는 Atomic Boolean의 역할은 무엇입니까?
Atomic*는 Atomic*의 보다 합니다.incrementAndGet()
「」, 「」,compareAndSet()
부부 、 [ get / set / set , test / set ) 。아토믹.
를 들어, 스레드가 다음 하고 있는 .++
, 경주 조건이 있을 것입니다 왜냐하면++
set.get, increment, set is입 。
private volatile value;
...
// race conditions here
value++;
단, 다음 코드는 잠금 없이 멀티 스레드 환경에서 안전하게 작동합니다.
private final AtomicLong value = new AtomicLong();
...
value.incrementAndGet();
또한 중요한 공유 자원을 오브젝트의 관점에서 캡슐화하기 위해서는 Atomic* 클래스를 사용하여 휘발성 필드를 랩핑하는 것이 좋습니다.즉, 개발자는 필드가 공유되지 않는다고 가정할 수 없으며, 필드++ 또는 레이스 조건을 도입하는 다른 코드를 주입할 수도 있습니다.
클래스 수준 변수에 액세스하는 여러 스레드가 있는 경우 각 스레드는 해당 변수의 복사본을 스레드 로컬 캐시에 보관할 수 있습니다.
변수를 휘발성으로 설정하면 스레드가 변수의 복사본을 스레드 로컬 캐시에 보관하지 못하게 됩니다.
원자 변수는 서로 다르며 값을 원자적으로 수정할 수 있습니다.
IDIOM을 기억해 주세요.
읽기 - 수정 - 휘발성으로는 달성할 수 없는 쓰기
부울 프리미티브타입은 쓰기 및 읽기 조작용 아토믹이며 휘발성은 occures-before 원칙을 보증합니다.따라서 단순한 get() 및 set()가 필요한 경우 Atomic Boolean은 필요하지 않습니다.
한편 변수 값을 설정하기 전에 체크(예: "참일 경우 false로 설정")를 실행해야 하는 경우에는 이 조작도 원자적으로 실행할 필요가 있습니다.이 경우 compareAndSet 및 AtomicBoolean이 제공하는 다른 메서드를 사용합니다.휘발성 부울을 사용하여 이 논리를 구현하려고 하면 동기화가 필요하기 때문입니다.get과 set 사이에 값이 변경되지 않았는지 확인합니다.
부울을 수정하는 스레드가1개밖에 없는 경우 휘발성 부울을 사용할 수 있습니다(일반적으로 이 작업을 통해 부울을 정의합니다).stop
스레드의 메인 루프에서 체크된 변수).
단, 부울을 수정하는 스레드가 여러 개 있는 경우,AtomicBoolean
그렇지 않으면 다음 코드가 안전하지 않습니다.
boolean r = !myVolatileBoolean;
이 조작은, 다음의 2개의 스텝으로 실시합니다.
- 부울 값이 읽힙니다.
- 부울 값이 써집니다.
다른 스레드가 다음 값 사이의 값을 변경하는 경우#1
그리고.2#
, 잘못된 결과를 얻을 수 있습니다. AtomicBoolean
메서드는 단계를 수행하여 이 문제를 회피합니다.#1
그리고.#2
원자적으로
둘 다 같은 개념이지만 아토믹 부울에서는 CPU 스위치가 그 사이에 발생했을 경우의 조작에 원자성을 제공합니다.
언급URL : https://stackoverflow.com/questions/3786825/volatile-boolean-vs-atomicboolean
'IT이야기' 카테고리의 다른 글
수분 보충 직후 Vuex 상태를 변경하시겠습니까? (0) | 2022.06.30 |
---|---|
"NoSuchMethodError: org.hamcrest"를 가져옵니다.Matcher.descriptMismatch" (IntelliJ 10.5에서 테스트 실행 시) (0) | 2022.06.30 |
같은 값의 라디오 버튼을 재사용하려면 어떻게 해야 합니까? (0) | 2022.06.30 |
HashMap, LinkedHashMap 및 TreeMap의 차이점 (0) | 2022.06.30 |
내보낸 이벤트가 Vue JS 구성 요소의 상위 메서드를 호출하지 않음 (0) | 2022.06.30 |