Обратите внимание на реализацию PublishSubject :
Что происходит при подписке?
PublishDisposable создается и добавляется к массиву подписчиков "через метод добавления (b [n] = ps;)
Теперь у PublishSubject есть массив подписчиков, который соблюдает порядок вставки
@Override
protected void subscribeActual(Observer<? super T> t) {
PublishDisposable<T> ps = new PublishDisposable<T>(t, this);
t.onSubscribe(ps);
if (add(ps)) {
// if cancellation happened while a successful add, the remove() didn't work
// so we need to do it again
if (ps.isDisposed()) {
remove(ps);
}
} else {
...
}
}
boolean add(PublishDisposable<T> ps) {
for (;;) {
PublishDisposable<T>[] a = subscribers.get();
if (a == TERMINATED) {
return false;
}
int n = a.length;
@SuppressWarnings("unchecked")
PublishDisposable<T>[] b = new PublishDisposable[n + 1];
System.arraycopy(a, 0, b, 0, n);
b[n] = ps;
if (subscribers.compareAndSet(a, b)) {
return true;
}
}
}
Теперь источник испускает новое значение через onNext. Метод onNext показывает вызов onNext-вызова подписчиков. Массив подписчиков перебирается от 0 до n. Следовательно, подписчики вызываются в порядке вставки , потому что по контракту onNext должен вызываться последовательно.
Observables должны отправлять уведомления наблюдателям последовательно (не параллельно). Они могут отправлять эти уведомления из разных потоков, но между уведомлениями должна быть формальная связь «происходит до». (http://reactivex.io/documentation/contract.html)
@Override
public void onNext(T t) {
ObjectHelper.requireNonNull(t, "onNext called with null. Null values are generally not allowed in 2.x operators and sources.");
for (PublishDisposable<T> pd : subscribers.get()) {
pd.onNext(t);
}
}