2016-09-27 7 views
2

RxJavaの内部については、David Karnokの記事thisを読んでいましたが、RxJavaのSerializedObserverクラスに近い実装例がありました。そこで問題は、なぜ内部q変数最初​​ブロックに導入されましたRxJava SerializedObserverの実装

class ValueListEmitterLoop<T> { 
    List<T> queue;       
    boolean emitting; 
    Consumer<? super T> consumer; 

    public void emit(T value) { 
     synchronized (this) { 
      if (emitting) { 
       List<T> q = queue; 
       if (q == null) { 
        q = new ArrayList<>(); 
        queue = q; 
       } 
       q.add(value); 
       return; 
      } 
      emitting = true; 
     } 
     consumer.accept(value);    
     for (;;) { 
      List<T> q; 
      synchronized (this) {   
       q = queue; 
       if (q == null) {    
        emitting = false; 
        return; 
       } 
       queue = null;    
      } 
      q.forEach(consumer);    
     }   
    } 
} 

:ここでは、コードのですか?私は明らかに第二の​​ブロックの中でその背後にある推論を見る。

if (queue == null) { 
    queue = new ArrayList<>(); 
} 
queue.add(value); 

答えて

2

私はそれを彼らは複数回使用されており、いくつかの揮発性/同期のアクセスが近くにある場合は特に、ローカル変数へのフィールドを読むことをお勧めを見つける:私は使用しないように行方不明ですどんな理由があります。

volatile boolean cancelled; 

final Queue<T> queue; 

final Subscriber<? super T> actual; 

void drain() { 
    Subscriber<? super T> a = actual; 
    Queue<T> q = queue; 

    for (;;) { 
     if (cancelled) { 
      return; 
     } 

     T v = q.poll(); 

     if (v == null) { 
      a.onComplete(); 
      return; 
     } 

     a.onNext(v); 
    } 
} 

aqフィールドがアクセスし、プロセッサ/ JVMが原因の揮発アクセスのバックメモリからすべての時間をそれらを読んでする必要がありますした場合:たとえば、次のように一般的なパターンです

cancelledおよび類似のアトミックがpoll()である。

+0

ありがとうございました!私はあなたの答えを期待していた。 –

関連する問題