<aside> <img src="/icons/info-alternate_blue.svg" alt="/icons/info-alternate_blue.svg" width="40px" /> Map의 forEach의 반복문 순서를 얻기 위해 사용을 하였음

</aside>

<aside> <img src="/icons/info-alternate_blue.svg" alt="/icons/info-alternate_blue.svg" width="40px" /> AtomicInteger - JAVA 1.5 부터

원자적으로 업데이트 될 수 있는 int 값

원자적으로 증가하는 카운터와 같은 애플리케이션에 사용

Integer를 대체 할 수는 없음

숫자 기반 클래스를 처리하는 도구 및 유틸리티의 균일한 액세스 허용을 하기 위해 Number를 확장

원자적이란?

어떤 작업이나 연산이 더 이상 분할될 수 없는 단일 단위로 수행된다는 것을 의미

불가분성: 연산이 중간에 끊기거나 다른 연산과 섞이지 않고 한 번에 완전히 수행됨.

동시성 안전성: 여러 스레드가 동시에 접근하더라도 연산이 안전하게 수행됨.

</aside>

public class AtomicInteger extends Number implements java.io.Serializable

<aside> <img src="/icons/info-alternate_blue.svg" alt="/icons/info-alternate_blue.svg" width="40px" /> AtomicInteger.getAndIncrement 메소드

VarHandle(Unsafe).getAndAdd 에 지정된 메모리 효과를 사용하여 현재 값을 원자적으로 증가시킵니다.

getAndAdd(1) 과 동일합니다

</aside>

**// AtomicInteger.java**
public final int getAndIncrement() {
	return U.getAndAddInt(this, VALUE, 1);
}

<aside> <img src="/icons/info-alternate_blue.svg" alt="/icons/info-alternate_blue.svg" width="40px" /> U.getAndAddInt에 U는 무슨 객체 인가요 ?

저수준의, 안전하지 않은 작업을 수행하기 위한 메서드 모음입니다.

이 클래스와 모든 메서드는 공개되어 있지만, 이 클래스의 사용은 제한적입니다. 왜냐하면 신뢰할 수 있는 코드만 인스턴스를 얻을 수 있기 때문입니다.

주의: 이 클래스의 메서드를 호출하기 전에 인수를 확인하는 것은 호출자의 책임입니다. 입력에 대해 몇 가지 기본적인 검사가 수행되기는 하지만, 이러한 검사는 최선을 다해 수행되며, 런타임 컴파일러에 의해 이 클래스의 메서드가 최적화될 때 성능이 최우선시되는 경우 일부 또는 모든 검사(있는 경우)가 생략될 수 있습니다. 따라서 호출자는 이러한 검사 및 해당 예외에 의존해서는 안 됩니다!

Unsafe의 해결되지 않은 순환 시작 종속성은 무엇인가요 ?

Java 클래스는 처음으로 참조될 때 초기화됩니다. 초기화 순서는 JVM에 의해 결정되며, 서로 참조하는 클래스들 간에 초기화 순서가 잘못되면 순환 종속성이 발생할 수 있습니다.

Unsafe 클래스는 일반적인 Java 클래스의 초기화 과정과는 다르게 동작할 수 있는 메서드들을 제공합니다. 예를 들어, 메모리 접근, 객체 생성, 필드 값 변경 등을 비정상적인 방법으로 수행할 수 있습니다.이러한 저수준 기능들을 사용할 때, 클래스 초기화 순서를 무시하거나 무시할 수 있는 방법을 제공하기 때문에, 클래스 초기화 과정에서 순환 종속성 문제가 발생할 수 있습니다.

</aside>

**// AtomicInteger.java**

/*
 * 이 클래스는 VarHandles를 사용하여 구현하려고 했으나
 * **해결되지 않은 순환 시작 종속성이 있습니다.**
 */
private static final Unsafe U = Unsafe.getUnsafe();

private static final long VALUE
        = U.objectFieldOffset(AtomicInteger.class, "value");
private volatile int value;

volatile 지시어는 무엇인가요 ?

<aside> <img src="/icons/info-alternate_blue.svg" alt="/icons/info-alternate_blue.svg" width="40px" /> objectFieldOffset이란?

해당 클래스의 스토리지 할당에서 지정된 이름을 가진 필드의 위치를 보고합니다.

</aside>

public long objectFieldOffset(Class<?> c, String name) {
    if (c == null || name == null) {
        throw new NullPointerException();
    }

    return objectFieldOffset1(c, name);
}

// .. 다른 코드들

private native long objectFieldOffset1(Class<?> c, String name);

<aside> <img src="/icons/info-alternate_blue.svg" alt="/icons/info-alternate_blue.svg" width="40px" /> AtomicInteger.getAndIncrement에 사용되는 메소드

주어진 offset 에서 주어진 객체 o 내의 필드 또는 배열 요소의 현재 값에 주어진 값을 원자적으로 추가합니다.

매개변수:

o – 필드/ 요소를 업데이트할 객체/ 배열

offset – 필드/ 요소 오프셋

delta – 더할 값

반환:

이전 값

JAVA 1.8 부터

</aside>

<aside> <img src="/icons/info-alternate_blue.svg" alt="/icons/info-alternate_blue.svg" width="40px" /> @IntrinsicCandidate 어노테이션

HotSpot 가상 머신에 특화된 것입니다.

이 어노테이션은 어노테이션이 붙은 메서드가 HotSpot VM에 의해 내재화될 수 있음을 (하지만 보장되지는 않음) 나타냅니다.

메서드가 내재화된다는 것은 HotSpot VM이 성능을 향상시키기 위해 어노테이션이 붙은 메서드를 직접 작성된 어셈블리 코드 및/또는 직접 작성된 컴파일러 IR(컴파일러 내재 함수)로 대체하는 것을 의미합니다.

@IntrinsicCandidate 어노테이션은 Java 라이브러리 내부에서 사용되며, 따라서 애플리케이션 코드와는 관련이 없는 것으로 간주됩니다.

</aside>

**// Unsafe.java**
@IntrinsicCandidate
public final int getAndAddInt(Object o, long offset, int delta) {
    int v;
    do {
        v = getIntVolatile(o, offset);
    } while (!weakCompareAndSetInt(o, offset, v, v + delta));
    return v;
}

<aside> <img src="/icons/info-alternate_blue.svg" alt="/icons/info-alternate_blue.svg" width="40px" /> native에 @IntrinsicCandidate 어노테이션을 사용한 이유는 뭔가요?

native: Java가 아닌 다른 언어(예: C 또는 C++)로 구현된 메서드를 호출할 수 있도록 합니다.

@IntrinsicCandidate : 특정 메서드가 JVM에 의해 내재화(intrinsification)될 가능성이 있음을 나타냅니다. 내재화는 JVM이 자주 사용되는 메서드를 특별히 최적화하여 성능을 극대화하는 기법입니다.

내재화 작동 방식