Spec-Zone .ru
спецификации, руководства, описания, API
След: Существенные Классы
Урок: Параллелизм
Раздел: Высокоуровневые Объекты Параллелизма
Атомарные Переменные
Домашняя страница > Существенные Классы > Параллелизм

Атомарные Переменные

java.util.concurrent.atomic пакет определяет классы, которые поддерживают атомарные операции на единственных переменных. Все классы имеют get и set методы, которые работают как чтения и записи на volatile переменные. Таким образом, a set имеет происхождение - перед отношением с любым последующим get на той же самой переменной. Атомарное compareAndSet у метода также есть эти функции непротиворечивости памяти, также, как и простые атомарные арифметические методы, которые применяются к целочисленным атомарным переменным.

Чтобы видеть, как этот пакет мог бы использоваться, давайте возвратимся к Counter class мы первоначально имели обыкновение демонстрировать интерференцию потока:


class Counter {
    private int c = 0;

    public void increment() {
        c++;
    }

    public void decrement() {
        c--;
    }

    public int value() {
        return c;
    }

}

Один способ сделать Counter безопасный от интерференции потока должен сделать ее методы синхронизируемыми, как в SynchronizedCounter:


class SynchronizedCounter {
    private int c = 0;

    public synchronized void increment() {
        c++;
    }

    public synchronized void decrement() {
        c--;
    }

    public synchronized int value() {
        return c;
    }

}

Для этого простого class синхронизация является приемлемым решением. Но для более сложного class, мы могли бы хотеть избежать живого воздействия ненужной синхронизации. Замена int поле с AtomicInteger позволяет нам предотвращать интерференцию потока, не обращаясь к синхронизации, как в AtomicCounter:


import java.util.concurrent.atomic.AtomicInteger;

class AtomicCounter {
    private AtomicInteger c = new AtomicInteger(0);

    public void increment() {
        c.incrementAndGet();
    }

    public void decrement() {
        c.decrementAndGet();
    }

    public int value() {
        return c.get();
    }

}

Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Параллельные Наборы
Следующая страница: Параллельные Случайные числа