Not sure about this case. If one is terminated, why wait? I see that when the reminal state is swapped in, the AsyncSubject notifies its observers, but during this time, new subscribers have to wait. I'd instead add the onTerminated callback to the state so whenever a a subscription happens  to a terminated state, the callback can be instantly run without wait. I haven't checked the other subjects yet but I think their terminal operation should inherently thread safe.