Какое ключевое слово volatile полезно для

public class Counter {

private static final int COMMA_AND_SPACE_PLACE = 2;

private String mTextToCount;
private ArrayList<String> mSeparateWordsList;

public Counter(String mTextToCount) {
    this.mTextToCount = mTextToCount;

    mSeparateWordsList = cutStringIntoSeparateWords(mTextToCount);
}

private ArrayList<String> cutStringIntoSeparateWords(String text)
{
    ArrayList<String> returnedArrayList = new ArrayList<>();


    if(text.indexOf(',') == -1)
    {
        returnedArrayList.add(text);
        return returnedArrayList;
    }

    int position1 = 0;
    int position2 = 0;

    while(position2 < text.length())
    {
        char c = ',';
        if(text.toCharArray()[position2] == c)
        {
            String tmp = text.substring(position1, position2);
            position1 += tmp.length() + COMMA_AND_SPACE_PLACE;
            returnedArrayList.add(tmp);
        }
        position2++;
    }

    if(position1 < position2)
    {
        returnedArrayList.add(text.substring(position1, position2));
    }

    return returnedArrayList;
}

public int[] countWords()
{
    if(mSeparateWordsList == null) return null;


    HashMap<String, Integer> wordsMap = new HashMap<>();

    for(String s: mSeparateWordsList)
    {
        int cnt;

        if(wordsMap.containsKey(s))
        {
            cnt = wordsMap.get(s);
            cnt++;
        } else {
            cnt = 1;
        }
        wordsMap.put(s, cnt);
    }                
    return printCounterResults(wordsMap);
}

private int[] printCounterResults(HashMap<String, Integer> m)
{        
    int index = 0;
    int[] returnedIntArray = new int[m.size()];

    for(int i: m.values())
    {
        returnedIntArray[index] = i;
        index++;
    }

    return returnedIntArray;

}

}

605
задан Raedwald 13 March 2019 в 10:18
поделиться

8 ответов

volatile имеет семантику для видимости памяти. В основном значение volatile поле становится видимым всем читателям (другие потоки в особенности) после того, как операция записи завершится на нем. Без volatile, читатели видели некоторое необновленное значение.

Для ответа на вопрос: Да, я использую volatile переменная, чтобы управлять, продолжает ли некоторый код цикл. Тесты абонентского шлейфа эти volatile значение и продолжается, если это true. Условие может быть установлено к false путем вызова метода "остановки". Цикл видит false и завершается, когда он тестирует значение после того, как метод остановки завершает выполнение.

книга" Параллелизм Java на практике ", который я настоятельно рекомендую, дает хорошее объяснение volatile. Эта книга записана тем же человеком, который написал статью IBM, на которую ссылаются в вопросе (на самом деле, он цитирует свою книгу у основания той статьи). Мое использование volatile - то, что его статья называет "шаблон 1 флагом состояния".

, Если Вы хотите узнать больше, как volatile работы под капотом, читайте на [1 113] модель памяти Java . Если Вы хотите пойти кроме того уровень, проверьте хорошую книгу архитектуры ЭВМ как [1 114] Hennessy & Patterson и чтение о когерентности кэша и непротиворечивости кэша.

697
ответ дан Basil Bourque 13 March 2019 в 10:18
поделиться

Абсолютно, да. (И не только в Java, но также и в C#.) Существуют времена, когда необходимо получить или установить значение, которое, как гарантируют, будет атомарной операцией на данной платформе, интервале или булевской переменной, например, но не требует издержек блокировки потока. Энергозависимое ключевое слово позволяет Вам удостоверяться что при чтении значения, что Вы становитесь текущими значение и не кэшируемое значение, которое было просто сделано устаревшим записью на другом потоке.

3
ответ дан dgvid 13 March 2019 в 10:18
поделиться

Один типичный пример для использования volatile должен использовать volatile boolean переменная как флаг для завершения потока. Если Вы запустили поток, и Вы хотите быть в состоянии безопасно прервать его от различного потока, у Вас может быть поток, периодически проверяют флаг. Для остановки его установите флаг на истинный. Путем создания флага volatile, можно удостовериться, что поток, который проверяет его, будет видеть, что это было установлено в следующий раз, когда это проверяет его, не имея необходимость даже использовать synchronized блок.

30
ответ дан Dave L. 13 March 2019 в 10:18
поделиться

Да, энергозависимый должен использоваться каждый раз, когда Вы хотите, чтобы изменяемая переменная была получена доступ несколькими потоками. Это не очень общий вариант использования, потому что обычно необходимо выполнить больше, чем единственная атомарная операция (например, проверить переменное состояние прежде, чем изменить его), в этом случае Вы использовали бы синхронизируемый блок вместо этого.

12
ответ дан ykaganovich 13 March 2019 в 10:18
поделиться

энергозависимый очень полезно для остановки потоков.

Не то, чтобы необходимо писать собственные потоки, Java 1.6 имеет много хороших пулов потоков. Но если Вы будете уверены, что Вам нужен поток, необходимо будет знать, как остановить его.

шаблон, который я использую для потоков:

public class Foo extends Thread {
  private volatile boolean close = false;
  public void run() {
    while(!close) {
      // do work
    }
  }
  public void close() {
    close = true;
    // interrupt here if needed
  }
}

Уведомление, как нет никакой потребности в синхронизации

49
ответ дан Pyrolistical 13 March 2019 в 10:18
поделиться

Ҡ¦ энергозависимый модификатор гарантирует, что любой поток, который читает поле, будет видеть последний раз записанное значение. ” - Josh Bloch

, Если Вы думаете об использовании volatile, читайте на пакете java.util.concurrent , который имеет дело с атомарным поведением.

сообщение Википедии на Шаблон "одиночка" показывает энергозависимый используемый.

163
ответ дан 8 revs, 2 users 96% 13 March 2019 в 10:18
поделиться

Вы должны будете использовать 'энергозависимое' ключевое слово или 'синхронизировались' и любые другие инструменты управления совместным выполнением и методы, которые Вы могли бы иметь в Вашем распоряжении при разработке многопоточного приложения. Примером такого приложения являются настольные приложения.

при разработке приложения, которое было бы развернуто на сервере приложений (Tomcat, AS JBoss, Glassfish, и т.д.) Вы не должны обрабатывать управление совместным выполнением сами как его уже обращенный сервером приложений. На самом деле, если я помнил правильно, что стандарт EE Java запрещает любое управление совместным выполнением в сервлетах и EJBs, так как это - часть слоя 'инфраструктуры', который Вы предположили, чтобы быть освобожденными от обработки его. Вы только делаете управление совместным выполнением в таком приложении при реализации одноэлементных объектов. Это даже уже обратилось при вязании компонентов с помощью frameworkd как Spring.

Так, в большинстве случаев разработки Java, где приложение является веб-приложением и использованием платформа МОК как Spring или EJB, Вы не должны были бы использовать 'энергозависимый'.

5
ответ дан Arjan Tijms 13 March 2019 в 10:18
поделиться

Да, я использую его довольно много - это может быть очень полезно для многопоточного кода. Статья, на которую Вы указали, является хорошей. Хотя существует две важных вещи принять во внимание:

  1. необходимо только использовать энергозависимый, если Вы полностью понимаете то, что это делает и как это отличается к синхронизируемому. Во многих энергозависимых ситуациях появляется, на поверхности чтобы быть более простым больше производительной альтернативы синхронизируемому, когда часто лучшее понимание энергозависимых ясно давало бы понять, что синхронизировался, является единственной опцией, которая работала бы.
  2. энергозависимый на самом деле не работает в большом количестве более старых JVMs, хотя синхронизируется делает. Я не забываю видеть документ, который сослался на различные уровни поддержки в различном JVMs, но к сожалению я не могу найти его теперь. Определенно изучите его при использовании Java пред 1,5 или если Вы не управляете JVMs, на котором будет работать Ваша программа.
4
ответ дан MB. 13 March 2019 в 10:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: