RxJava服务器实现

RxJava服务器实现,java,concurrency,rx-java,Java,Concurrency,Rx Java,在阅读David Karnok关于RxJava内部构件的文章时,我遇到了一个实现类似RxJava的SerializedObjectServer类的示例。代码如下: class ValueListEmitterLoop<T> { List<T> queue; boolean emitting; Consumer<? super T> consumer; public void

在阅读David Karnok关于RxJava内部构件的文章时,我遇到了一个实现类似RxJava的
SerializedObjectServer
类的示例。代码如下:

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);            
        }        
    }
}

我发现将字段读入局部变量是一种很好的做法,特别是当它们被多次使用并且附近有一些易失性/同步访问时

例如,以下是一种常见模式:

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);
    }
}
volatile布尔取消;
最终队列;

最后感谢你!我希望你能回答。
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);
    }
}