본문 바로가기

JAVA

Java 멀티쓰레드 동기화 - (3) AtomicClass

728x90

https://wjdtn7823.tistory.com/65

https://wjdtn7823.tistory.com/67

 

Java 멀티쓰레드 동기화 - (1) Volatile

Java에는 멀티쓰레드 환경에서 동기화를 하기 위한 3가지 방법이 있다. 그중 Volatile 키워드에 대해서 설명하겠습니다. 1. volatile 키워드 JAVA에서 volatile 키워드는  변수를 read 하고 write 할때 CPU cach

wjdtn7823.tistory.com

 

Java 멀티쓰레드 동기화 - (2) Synchronized

Java에는 멀티쓰레드 환경에서 동기화를 하기 위한 3가지 방법이 있다. 이번에는 synchronized 키워드에 대해 얘기해보겠습니다. https://wjdtn7823.tistory.com/65 Java 멀티쓰레드 동기화 - (1) Volatile Java에..

wjdtn7823.tistory.com

 

Java에는 멀티쓰레드 환경에서 동기화를 하기 위한 3가지 방법이 있습니다.

마지막으로 AtomicClass에 대해 얘기해보겠습니다.

 

1. Compare and Swap

 

자바의 AtomicClass 는 Compare and Swap (CAS) 을 구현한 클래스입니다.

CAS 은 쓰레드 동기화 기법 중 하나로 연산을 하기전에 메모리의 값과 자신이 기대한 값을 비교한 후에

메모리에 Swap(메모리 Store 연산) 하는 기법입니다. CAS는 인터럽트할 수 없는 명령으로 메모리의 값을 읽고 기대한 값이랑 같은지 비교한후에 같으면 새로운 값을 메모리에 저장하는 값입니다. 실제 하드웨어에서 제공한 기능입니다.

 

The compare-and-swap (CAS) instruction is an uninterruptible instruction that reads a memory location, compares the read value with an expected value, and stores a new value in the memory location when the read value matches the expected value. Otherwise, nothing is done. The actual microprocessor instruction may differ somewhat (e.g., return true if CAS succeeded or false otherwise instead of the read value).

 

 

2. AtomicClass

자바에서는 AtomicClass를 통해 CAS 기능을 제공합니다.

 

아래 메소드는 AtomicInteger에서 제공하는 compareAndSet입니다.

위에서 설명햇듯이 expectedValue와 비교한후 같을 경우에만 newValue로 set합니다.

 

/**
     * Atomically sets the value to {@code newValue}
     * if the current value {@code == expectedValue},
     * with memory effects as specified by {@link VarHandle#compareAndSet}.
     *
     * @param expectedValue the expected value
     * @param newValue the new value
     * @return {@code true} if successful. False return indicates that
     * the actual value was not equal to the expected value.
     */
    public final boolean compareAndSet(int expectedValue, int newValue) {
        return U.compareAndSetInt(this, VALUE, expectedValue, newValue);
    }

 

1) 여러 쓰레드가 접근하면 첫번쨰 쓰레드가 먼저 값을 new value로 바꿉니다.

2) 그 다음 쓰레드부터는 compare 을 하려고 하지만 expected value가 다르기 떄문에 compare and swap에 실패합니다.

3) 이후 계속해서 compareandswap을 시도하고 그전 쓰레드가 모든 연산을 다 마친 후에 compare and swap을 할수 있게 됩니다.

 

java.util.concurrent 에서는 AtomicInteger 외에도 Long, Boolean ,IntegerArray등 다양한 자료형에 대한 Atomic class을 제공합니다.

'JAVA' 카테고리의 다른 글

HashMap 의 capacity와 load factor  (0) 2020.12.27
ThreadLocal  (0) 2020.11.22
Java 멀티쓰레드 동기화 - (2) Synchronized  (0) 2020.10.11
Java 멀티쓰레드 동기화 - (1) Volatile  (0) 2020.10.03
JPA 프록시와 연관관계 관리  (0) 2020.09.04