2015-10-06 9 views
5

Czy zmienna emitting może być niestabilna? Metoda emit() jest wywoływana z różnych wątków i muszą być widoczne. Jest dostępny tylko w blokach synchronized. // ... to miejsca, w których praca jest wykonywana, ale tutaj nie ma odniesienia do emitting.Czy lotny jest potrzebny, w przypadku tylko zsynchronizowanego dostępu

Tak więc, jeśli struktura synchronized jest ustalić, czy nadal potrzebują volatile dla emitting czy nie? (I dlaczego?)

static final class C { 
    boolean emitting = false; // shall be volatile ? 

    public void emit() { 
     synchronized (this) { 
      if (emitting) { 
       return; 
      } 
      // ... 
      emitting = true; 
     } 

     // ... 

     synchronized (this) { 
      if (!condition()) { 
       emitting = false; 
       return; 
      } 
     } 
     // ... 
    } 

Frank

Odpowiedz

5

Jeśli jest dostępny tylko z synchronized bloków nie jest potrzebny słowa kluczowego volatile.

Zsynchronizowane gwarancje, że zmiany w zmiennych dostępnych w zsynchronizowanym bloku są widoczne dla wszystkich wątków wchodzących do zsynchronizowanego bloku.

Z współbieżności książka Java w praktyce:

opublikować obiekt bezpiecznie, zarówno odniesienie do obiektu i stan obiektu musi być widoczny dla innych wątków jednocześnie czas. Właściwie skonstruowany obiekt może być bezpiecznie opublikowany przez:

  • Inicjowanie referencji obiektu ze statycznego inicjalizatora;
  • Przechowywanie odniesienia do niego w polu lotnym lub Atomowym Odniesieniu ;
  • Przechowywanie odniesienia do niego w polu końcowym poprawnie skonstruowanego obiektu;
  • Przechowywanie odnośnika w odpowiednim polu chronionym przez blokadę.

Uwaga:strzeżone przez blokadę oznacza weszła w zsynchronizowany bloku

Powiązane problemy