Java volatile для параллелизма - PullRequest
1 голос
/ 19 августа 2010

Хорошо, я только что прочитал этот вопрос Вы когда-нибудь использовали ключевое слово volatile в Java? , и я использую переменную volatile для остановки цикла. Также я видел эту ссылку, http://www.javamex.com/tutorials/synchronization_volatile.shtml. Теперь в статье говорится, что переменные переменные неблокируют. Также говорится, что его нельзя использовать для параллелизма в последовательности чтения-обновления-записи. Что имеет смысл, потому что они не блокируют.

Поскольку энергозависимые переменные никогда не кэшируются, быстрее ли просто использовать синхронизацию для остановки цикла (по более ранней ссылке)?

Редактировать: Использование синхронизированного решения

public class A{
  private boolean test;

  public A(){
    test = true;
  }

  public synchronized void stop(){
    test = false;
  }

  public synchronized boolean isTrue(){
    return test;
  }
}

public class B extends Thread {
  private A a;

  public B(A refA){
    a = refA;
  }

  public void run(){
    //Does stuff here
    try{
      sleep(1000);
    }
    catch(Exception e){}
    a.stop();
  }

  public static void main(String [] args){
    A TestA = new A();
    B TestB = new B(TestA);
    TestB.start();
    while(TestA.isTrue()){
      //stay in loop
      System.out.println("still in loop");
    }
    System.out.println("Done with loop");
  }
 }

Ответы [ 2 ]

6 голосов
/ 19 августа 2010

Нет, чтение переменной volatile происходит быстрее, чем чтение переменной не volatile в блоке synchronized.

Блок

A synchronized очищает кэшированные значения при вводе, что аналогично чтению переменной volatile. Но также сбрасывает любые кэшированные записи в основную память при выходе из синхронизированного блока, что не требуется при чтении переменной volatile.

1 голос
/ 19 августа 2010

В вашем вопросе есть много неправильных вещей: вы можете делать надежное чтение-обновление-запись с volatile, если вы используете Atomic*FieldUpdater и цикл-цикл. Летучие вещества могут быть «кэшированы», им просто нужно подчиняться соответствующей случаем - до указанной семантики.

Синхронизация обычно включает получение блокировки, которая является относительно дорогой (хотя на самом деле может быть довольно дешевой). Простые параллельные оптимизации могут использовать не наивные методы реализации.

...