Альтернатива для летучих веществ с самым низким быстродействием - PullRequest
2 голосов
/ 01 апреля 2009

Я хочу реализовать обычный кооперативный механизм для отмены потока. Однако модель памяти Java была исправлена ​​только в JDK5, пока я нахожусь в среде до JDK5. Я понимаю, это означает, что делать что-то подобное, как это делается в SCIP, будет неправильно.

class Worker implements Runnable
{
    private volatile boolean _canceled;

    public void cancel() { _canceled = true; }

    public void run() {
        while( ! _canceled )
        {
            // do my Stuff
        }
    }
}

Я думаю об использовании AtomicBoolean для инкапсуляции переменной _canceled. Любые другие альтернативы?

Ответы [ 5 ]

3 голосов
/ 01 апреля 2009

Если я правильно понимаю FAQ , это не проблема в старой модели памяти, которая позволяла переупорядочивать изменчивые поля. В их примере старая модель позволила бы «x» быть или 0 или 42 основанным на JVM. Эмпирическое правило заключается в том, что переупорядочение всегда должно повышать производительность компилятора / процессора, но не должно быть видимым для программиста. Старая модель нарушила это правило.

Ваш пример не должен страдать от этой проблемы с видимостью и будет работать

3 голосов
/ 01 апреля 2009

AtomicBoolean также был добавлен в JDK5, поэтому он недоступен, если вы не используете backport . Однако, да, атомарный класс из бэкпорта может быть лучшим выбором, как вы знаете, он был написан людьми, которые разбираются в том, что работает в каждой версии спецификации виртуальной машины JVM.

1 голос
/ 01 апреля 2009

IIRC, очень старые Sun JRE вообще не реализовывали изменчивость. Ясно попытался, старый JMM позволяет использовать летучие вещества таким способом (о единственном способе их использования). Я понимаю, что Sun 1.4 JRE на самом деле реализует 1.5 JMM с любыми отличиями, считающимися ошибками.

1 голос
/ 01 апреля 2009

Может помочь пакет util.concurrent от Doug Lea (предшественник java.util.concurrent).

0 голосов
/ 01 апреля 2009

Я не думаю, что AtomicBoolean был доступен до Java 5. Как насчет синхронизации на частном логическом поле?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...