#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
, s3. Поскольку вы в принципе можете выполнять любой код на C через JNI, вы, безусловно, можете его написать. Но почему?