Можно ли реализовать собственный атомарный регистр на Java? (jdk.внутренний.разное.Небезопасно)

#java #atomic #compare-and-swap

Вопрос:

Возможно ли реализовать мои собственные AtomicInteger на Java?

Что я вижу под колпаком методов:

 public final int addAndGet(int delta) {
    for (;;) {
        int current = get();
        int next = current   delta;         // Only difference
        if (compareAndSet(current, next))
            return next;
    }
}

public final int incrementAndGet() {
    for (;;) {
        int current = get();
        int next = current   1;             // Only difference
        if (compareAndSet(current, next))
            return next;
    }
}
 

Так что в любом случае нужно использовать compareAndSet. Который:

 public final boolean compareAndSet(int expectedValue, int newValue) {
        return U.compareAndSetInt(this, VALUE, expectedValue, newValue);
    }
 

где
private static final jdk.internal.misc.Unsafe U = jdk.internal.misc.Unsafe.getUnsafe() ;

Поэтому все атомики используют небезопасные ( что я хорошо не знаю и сильно сомневаюсь, нужен ли он на работе), которые, я полагаю, используют инструкции низкого уровня/процессора

 Compare and Swap
 

Мой вопрос: можно ли написать атомику на java или в любом случае нужно позвонить Unsafe и в конечном итоге получить ее?

Комментарии:

1. Независимо от того, что вы делаете, в конечном итоге это должно будет закончиться где-то в глубине души вызовом собственных инструкций. Тем не менее, в Java доступны механизмы высокого уровня, которые вы можете использовать. Например synchronized , или блокировки, мьютексы, … Так что вы могли бы построить свой собственный AtomicInteger поверх этого. Но в конечном счете эти классы или языковые механизмы также будут вызывать собственные инструкции.

2. Вам явно не нужно использовать Unsafe , но, возможно VarHandle , s

3. Поскольку вы в принципе можете выполнять любой код на C через JNI, вы, безусловно, можете его написать. Но почему?