Java: notifyObservers 不是并发的?
Java: notifyObservers not concurrent?
我有 4 个观察者在监听一个可观察的数据。然而,我的一位观察员速度较慢并且可以接受。我刚刚看到 notifyObserver 的代码为:-
132 public void notifyObservers(Object arg) {
133 /*
134 * a temporary array buffer, used as a snapshot of the state of
135 * current Observers.
136 */
137 Object[] arrLocal;
138
139 synchronized (this) {
/**comment removed for clarity **/
152 if (!changed)
153 return;
154 arrLocal = obs.toArray();
155 clearChanged();
156 }
157
158 for (int i = arrLocal.length-1; i>=0; i--)
159 ((Observer)arrLocal[i]).update(this, arg);
160 }
从代码中可以看出,观察者是一个接一个被调用的。按照设计,观察者在执行中是独立的。函数不应该同时调用它们并使 arg
成为最终的吗?
当前执行时间是 t1+t2+t3+t4
,应该是 max(t1,t2,t3,t4)
。我可以使观察者的 update
函数成为非阻塞的,但这并不相同,并且可能会导致一些竞争条件,因为 notifyObservers()
将在观察者未完全执行的情况下退出。
我是否遗漏了这个设计背后的某些东西?是故意的,我没办法减少在这里的时间吗?
优化通知观察者的执行时间不是模式的一部分。有很长 运行 任务要做的观察者应该立即从 update()
开始他们自己的执行线程和 return 而不是阻塞。
上下文:Java 中的 Observer 实现是适用于 many 但不适用于 all 的通用实现设计] 例。顺序调用 update()
方法的主要原因是许多框架(例如 GUI 和可能的应用程序代码)被设计为单线程并且并行执行观察者肯定会导致一些竞争条件。
解决方案:要么在 Observer 的 update()
方法中的单独线程中执行逻辑(如 Samuel 解释的那样),要么,如果您总是想并行执行 update()
方法,请创建您的自己的实现并在 notifyObservers()
方法中使用例如 ExecutorService
。
我有 4 个观察者在监听一个可观察的数据。然而,我的一位观察员速度较慢并且可以接受。我刚刚看到 notifyObserver 的代码为:-
132 public void notifyObservers(Object arg) {
133 /*
134 * a temporary array buffer, used as a snapshot of the state of
135 * current Observers.
136 */
137 Object[] arrLocal;
138
139 synchronized (this) {
/**comment removed for clarity **/
152 if (!changed)
153 return;
154 arrLocal = obs.toArray();
155 clearChanged();
156 }
157
158 for (int i = arrLocal.length-1; i>=0; i--)
159 ((Observer)arrLocal[i]).update(this, arg);
160 }
从代码中可以看出,观察者是一个接一个被调用的。按照设计,观察者在执行中是独立的。函数不应该同时调用它们并使 arg
成为最终的吗?
当前执行时间是 t1+t2+t3+t4
,应该是 max(t1,t2,t3,t4)
。我可以使观察者的 update
函数成为非阻塞的,但这并不相同,并且可能会导致一些竞争条件,因为 notifyObservers()
将在观察者未完全执行的情况下退出。
我是否遗漏了这个设计背后的某些东西?是故意的,我没办法减少在这里的时间吗?
优化通知观察者的执行时间不是模式的一部分。有很长 运行 任务要做的观察者应该立即从 update()
开始他们自己的执行线程和 return 而不是阻塞。
上下文:Java 中的 Observer 实现是适用于 many 但不适用于 all 的通用实现设计] 例。顺序调用 update()
方法的主要原因是许多框架(例如 GUI 和可能的应用程序代码)被设计为单线程并且并行执行观察者肯定会导致一些竞争条件。
解决方案:要么在 Observer 的 update()
方法中的单独线程中执行逻辑(如 Samuel 解释的那样),要么,如果您总是想并行执行 update()
方法,请创建您的自己的实现并在 notifyObservers()
方法中使用例如 ExecutorService
。