programing

자바에서는 언제 Atomic Boolean을 사용해야 하나요?

bestcode 2022. 8. 31. 22:43
반응형

자바에서는 언제 Atomic Boolean을 사용해야 하나요?

Atomic Boolean은 어떻게 사용할 수 있으며 그 클래스는 무엇에 사용합니까?

여러 스레드가 부울을 확인하고 변경해야 하는 경우.예를 들어 다음과 같습니다.

if (!initialized) {
   initialize();
   initialized = true;
}

이것은 나사산 안전이 아니다.를 사용하여 수정할 수 있습니다.AtomicBoolean:

if (atomicInitialized.compareAndSet(false, true)) {
    initialize();
}

여기 Brian Goetz 책에서 만든 노트입니다. 당신에게 도움이 될 것 같습니다.

ATOMIC XXX 클래스

  • 논블로킹 비교 및 스왑 구현 제공

  • 하드웨어에 의한 지원(인텔의 CMPXCHG 명령)을 활용합니다.이러한 아토믹 동시성 API를 사용하는 코드에서 많은 스레드가 실행되고 있는 경우 오브젝트레벨의 모니터/동기화를 사용하는 코드보다 훨씬 잘 확장됩니다.Java의 동기화 메커니즘은 코드를 대기시키기 때문에 중요한 섹션을 통과하는 스레드가 많을 경우 동기화 메커니즘 자체(대기, 알림 등)를 관리하는 데 상당한 CPU 시간이 소요됩니다.새로운 API는 하드웨어 수준의 구조(원자 변수)와 대기 및 잠금 없는 알고리즘을 사용하여 스레드 안전성을 구현하기 때문에 동기화 관리보다는 CPU에 더 많은 시간을 할애할 수 있습니다.

  • throughput이 향상될 뿐만 아니라 교착 상태나 priority 반전 등의 활성 문제에 대한 저항력이 높아집니다.

원자 부울을 사용할 수 있는 이유는 크게 두 가지가 있습니다.먼저, 예를 들어 이 값을 참조로 전달하고 부울 자체에 연결된 값을 변경할 수 있습니다.

public final class MyThreadSafeClass{

    private AtomicBoolean myBoolean = new AtomicBoolean(false);
    private SomeThreadSafeObject someObject = new SomeThreadSafeObject();

    public boolean doSomething(){
         someObject.doSomeWork(myBoolean);
         return myBoolean.get(); //will return true
    }
}

및 someObject 클래스에서

public final class SomeThreadSafeObject{
    public void doSomeWork(AtomicBoolean b){
        b.set(true);
    }
}

그러나 더 중요한 것은 스레드 안전하며 클래스를 유지하는 개발자에게 이 변수가 수정되고 여러 스레드에서 읽혀질 것으로 예상된다는 것을 나타낼 수 있다는 것입니다.Atomic Boolean을 사용하지 않을 경우 사용 중인 부울 변수를 volatile로 선언하거나 필드의 읽기 및 쓰기 주변에서 동기화하여 동기화해야 합니다.

AtomicBooleanclass는 atomic적으로 갱신할 수 있는 부울값을 제공합니다.부울 변수에 액세스하는 스레드가 여러 개인 경우 사용합니다.

java.util.concurrent.atomic 패키지의 개요는 이 패키지의 클래스가 수행하는 작업과 클래스 사용 시기에 대한 개략적인 설명을 제공합니다.Brian Goetz의 Java Concurrency in Practice라는 도 추천합니다.

패키지 설명에서 발췌

패키지 java.util.concurrent.atomic 설명:단일 변수에 대한 잠금 없는 스레드 세이프 프로그래밍을 지원하는 작은 클래스 도구 모음입니다. [...]

이러한 방법의 사양에 의해, 실장에서는, 현재의 프로세서에서 이용할 수 있는 효율적인 머신 레벨의 원자력 명령을 채용할 수 있습니다.[...]

클래스 인스턴스 AtomicBoolean, AtomicInteger, AtomicLong 및 AtomicReference는 각각 대응하는 유형의 단일 변수에 대한 액세스 및 업데이트를 제공합니다.[ ... ]

atomics의 액세스와 업데이트에 대한 메모리 효과는 일반적으로 휘발성 물질에 대한 규칙을 따릅니다.

  • get에는 휘발성 변수를 읽는 메모리 효과가 있습니다.
  • set에는 휘발성 변수를 쓰는(메모리) 메모리 효과가 있습니다.
  • weakCompareAndSet은 변수를 원자적으로 읽고 조건부로 씁니다.이러한 값은 변수의 다른 메모리 동작에 대해 순서가 매겨지지만 그 이외의 경우에는 일반적인 비휘발성 메모리 동작으로 동작합니다.
  • compareAndSet 및 getAndIncrement와 같은 기타 모든 읽기 및 업데이트 작업은 휘발성 변수 읽기 및 쓰기의 메모리 효과가 있습니다.

언급URL : https://stackoverflow.com/questions/4501223/when-do-i-need-to-use-atomicboolean-in-java

반응형