IT이야기

휘발성 부울 vs Atomic Boolean

cyworld 2022. 6. 30. 23:28
반응형

휘발성 부울 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,getAndSetvolatile boolean atomic operation(휘발성 부울)

AtomicBoolean에는 복합연산을 , 이 가 없습니다.synchronizedblock.에.,.,.,.volatile boolean는, 조작을 할 수 있는 는, 「 할 수 .synchronized

:volatile boolean, 똑같아요.get ★★★★★★★★★★★★★★★★★」setAtomicBoolean각각 다음과 같다.

를 들면, 「 」입니다.compareAndSet로 다음 작업을 합니다(method는 method를 사용하지 않습니다.synchronized★★★★★

if (value == expectedValue) {
    value = newValue;
    return true;
} else {
    return false;
}

때문에, 「 」는,compareAndSetmethod를 사용하면 여러 스레드에서 호출된 경우에도 한 번만 실행이 보장되는 코드를 쓸 수 있습니다.예를 들어 다음과 같습니다.

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. 부울 값이 써집니다.

다른 스레드가 다음 값 사이의 값을 변경하는 경우#1그리고.2#, 잘못된 결과를 얻을 수 있습니다. AtomicBoolean메서드는 단계를 수행하여 이 문제를 회피합니다.#1그리고.#2원자적으로

둘 다 같은 개념이지만 아토믹 부울에서는 CPU 스위치가 그 사이에 발생했을 경우의 조작에 원자성을 제공합니다.

언급URL : https://stackoverflow.com/questions/3786825/volatile-boolean-vs-atomicboolean

반응형