|
20 | 20 |
|
21 | 21 | import java.util.ArrayList;
|
22 | 22 | import java.util.List;
|
| 23 | +import java.util.Set; |
| 24 | +import java.util.HashSet; |
23 | 25 | import java.util.concurrent.ConcurrentHashMap;
|
24 | 26 | import java.util.concurrent.atomic.AtomicBoolean;
|
25 | 27 | import java.util.concurrent.atomic.AtomicReference;
|
@@ -94,23 +96,47 @@ protected PublishSubject(Func1<Observer<T>, Subscription> onSubscribe, Concurren
|
94 | 96 |
|
95 | 97 | @Override
|
96 | 98 | public void onCompleted() {
|
97 |
| - for (Observer<T> observer : observers.values()) { |
98 |
| - observer.onCompleted(); |
99 |
| - } |
| 99 | + int observersSize; |
| 100 | + Set<Observer<T>> notifiedObservers = new HashSet<Observer<T>>(); |
| 101 | + do { |
| 102 | + observersSize = observers.size(); |
| 103 | + for (Observer<T> observer : observers.values()) { |
| 104 | + if (!notifiedObservers.contains(observer)) { |
| 105 | + observer.onCompleted(); |
| 106 | + notifiedObservers.add(observer); |
| 107 | + } |
| 108 | + } |
| 109 | + } while (observers.size() > observersSize); |
100 | 110 | }
|
101 | 111 |
|
102 | 112 | @Override
|
103 | 113 | public void onError(Exception e) {
|
104 |
| - for (Observer<T> observer : observers.values()) { |
105 |
| - observer.onError(e); |
106 |
| - } |
| 114 | + int observersSize; |
| 115 | + Set<Observer<T>> notifiedObservers = new HashSet<Observer<T>>(); |
| 116 | + do { |
| 117 | + observersSize = observers.size(); |
| 118 | + for (Observer<T> observer : observers.values()) { |
| 119 | + if (!notifiedObservers.contains(observer)) { |
| 120 | + observer.onError(e); |
| 121 | + notifiedObservers.add(observer); |
| 122 | + } |
| 123 | + } |
| 124 | + } while (observers.size() > observersSize); |
107 | 125 | }
|
108 | 126 |
|
109 | 127 | @Override
|
110 | 128 | public void onNext(T args) {
|
111 |
| - for (Observer<T> observer : observers.values()) { |
112 |
| - observer.onNext(args); |
113 |
| - } |
| 129 | + int observersSize; |
| 130 | + Set<Observer<T>> notifiedObservers = new HashSet<Observer<T>>(); |
| 131 | + do { |
| 132 | + observersSize = observers.size(); |
| 133 | + for (Observer<T> observer : observers.values()) { |
| 134 | + if (!notifiedObservers.contains(observer)) { |
| 135 | + observer.onNext(args); |
| 136 | + notifiedObservers.add(observer); |
| 137 | + } |
| 138 | + } |
| 139 | + } while (observers.size() > observersSize); |
114 | 140 | }
|
115 | 141 |
|
116 | 142 | public static class UnitTest {
|
|
0 commit comments