Использование AtomicInteger и введение в исходный код

Java задняя часть
Использование AtomicInteger и введение в исходный код

Это 9-й день моего участия в Gengwen Challenge, проверяйте подробности мероприятия:Обновить вызов

Добавить Автора

Публичный аккаунт WeChat: разработка Java ноль к одному

предисловие

AtomicInteger — это атомарный класс в составе пакета java.util.concurrent.atomic, который также включает AtomicBoolean, AtomicLong, AtomicLongArray, AtomicReference и другие атомарные классы, которые в основном используются для обеспечения безопасности потоков в среде с высокой степенью параллелизма.

текст

1. Сцена

Как мы все знаем, ++ эта операция в случае одновременного выполнения нескольких потоков не является потокобезопасной. И поскольку процесс ++ состоит из трех шагов, а именно неатомарного, поэтому даже с volatile не гарантирует потокобезопасности, а блокировка (например, Synchronized) сильно влияет на производительность, поэтому на этот раз идеально использовать AtomicInteger для достижения переменная саморазвития.

2. Код дела

import java.util.concurrent.atomic.AtomicInteger;

public class AtomicIntegerDemo implements Runnable {
    private static final AtomicInteger atomicInteger = new AtomicInteger();

    //增加指定数量
    public void getAndAdd() {
        atomicInteger.getAndAdd(-90);
    }
    //增加1
    public void getAndIncrement() {
        atomicInteger.getAndIncrement();
    }
    //减少1
    public void getAndDecrement() {
        atomicInteger.getAndDecrement();
    }
    public static void main(String[] args) throws InterruptedException {
        AtomicIntegerDemo r = new AtomicIntegerDemo();
        Thread t1 = new Thread(r);
        t1.start();
        t1.join();
        System.out.println("AtomicInteger操作结果:" + atomicInteger.get());
    }

    @Override
    public void run() {
        for (int i = 0; i < 10000; i++) {
            getAndDecrement();
        }
    }
}

3. Введение метода

  1. getAndIncrement

+1 переменная atomicInteger.

  1. getAndAdd

Переменная atomicInteger может быть увеличена на N (указанный размер приращения).

  1. getAndDecrement

Оперирует -1 для переменной atomicInteger.

  1. get

Получите текущее значение AtomicInteger.

4. Знакомство с исходным кодом

Вот введение в метод AtomicInteger.incrementAndGet(). В этом методе есть бесконечный цикл. Сначала он получает текущее значение, а затем вызывает метод compareAndSet, чтобы определить, было ли текущее значение изменено другими потоками. возвращает false, он будет продолжать повторять попытки до тех пор, пока не добьется успеха, это сущность атомарности, которую может достичь AtomicInteger.

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

Упомянутый выше compareAndSet, вот исходный код:

public final boolean compareAndSet(int expect, int update) {
    return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}

Как видно из исходного кода: compareAndSet() вызывает метод Unsafe.compareAndSwapInt(), который является операцией CAS класса Unsafe.

КАС будет«Сидя в яме, можно попасть и на большой завод»Серии объяснить, заинтересованные партнеры могут сосредоточиться на небольшом.

Суммировать

Сценарий применения AtomicInteger также относительно прост. За исключением ситуации с высокой конкуренцией, атомарные классы имеют более точную детализацию и более высокую эффективность, чем обычные блокировки. В этой статье представлены общие методы. Если вам нужно глубокое понимание исходного кода, вы можете продолжить чтобы изучить. Если у вас есть какие-либо вопросы, вы можете оставить комментарий под статьей.

Будьте внимательны, чтобы не потерять

Выше приведено все содержание этого вопроса,Если есть какие-либо ошибки, пожалуйста, оставьте сообщение для совета, большое спасибо. Я GieGie. Если у вас есть какие-либо вопросы, не стесняйтесь оставлять сообщение для обсуждения. До встречи в следующем выпуске 🦮.

Статья постоянно обновляется, вы можете искать в WeChatРазработка на Java ноль к одномуПрочтите это в первый раз и получите егоУчебное видео по материалам интервьюПодождите, заинтересованные друзья могут обратить внимание, учиться вместе и работать вместе 🐮🥃.

Оригинальность непроста, как можно терпеть проститутку даром?, если вы считаете, что эта статья вам полезна, спасибо старому железяку за эту статью点个赞、评论或转发一下, потому что это будет моей мотивацией выводить больше качественных статей, спасибо!