2013-05-09 5 views
0

Я использовал этот шаблон некоторое время, но я только недавно пришел к мысли, что это может быть не так. В основном, я использую некий вариант этой модели:Неувязчивые «флаги» threadsafe в Java?

public class SampleJavaAsync 
{ 
    public SampleJavaAsync() { } 

    private boolean completed; 
    public void start() 
    { 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       //... do something on a different thread 
       completed = true; 
      } 
     }).start(); 
    } 

    public void update() 
    { 
     if (!completed) return; 
     //... do something else 
    } 
} 

* Пользователь несет ответственность за то, чтобы start вызывалась только один раз. update называется везде и где угодно.

Я всегда предполагал, что это потокобезопасно на Java, потому что, хотя ничто не строго синхронизировано, я только установил completed в true. Как только будет наблюдаться true, он не будет сброшен до false. Он инициализируется значением false в конструкторе, который по определению является потокобезопасным (если вы не делаете в нем что-то глупое). Таким образом, безопасно ли использовать потоки с помощью несанкционированных флагов? (И если да, то это даже дает никаких преимуществ производительности?)

Благодаря

ответ

3

Java: это возможно для обновления(), чтобы не видеть обновление завершено, что уже произошло. Если вы не отметите ее изменчивость, JVM разрешено делать всевозможные вещи во имя оптимизации (а именно, переупорядочивать чтение и запись по мере ее соответствия), что означает, что вы могли бы эффективно попасть в состояние, в котором поток, выполняющий обновление() НИКОГДА не видит, что завершено, потому что оно не отмечено изменчивым, и оно думает, что оно может оптимизировать, что надоедливая запись (или отсрочка).

Вы, по крайней мере, рискуете иметь несогласованность, когда он впервые установлен, где, например, вызов update() в том же потоке мог видеть другое значение, чем тот же вызов из другого потока, в то же время.

Лучше объяснил:

http://jeremymanson.blogspot.com/2008/11/what-volatile-means-in-java.html

Или, если вы действительно хотите знать, параллельности в Java, купить копию JCIP:

http://jcip.net.s3-website-us-east-1.amazonaws.com/

+0

Спасибо за ответ! – aboveyou00

Смежные вопросы