我正在努力做出决定。我在写一个线程安全的库/ API。听众可以注册,所以当有趣的事情发生时通知客户。这两种实现中哪一种最常见?通知内部或外部同步内部监听器
class MyModule {
protected Listener listener;
protected void somethingHappens() {
synchronized(this) {
... do useful stuff ...
listener.notify();
}
}
}
或
class MyModule {
protected Listener listener;
protected void somethingHappens() {
Listener l = null;
synchronized(this) {
... do useful stuff ...
l = listener;
}
l.notify();
}
}
在第一实施方式中,监听器同步内通知。在第二个实现中,这是在同步之外完成的。
我觉得第二个建议,因为它减少了潜在的死锁空间。但我很难说服自己。
第二个插件的缺点是客户端可能会收到'不正确的'通知,如果它在l.notify()语句之前访问并更改模块,则会发生这种情况。例如,如果它要求模块停止发送通知,则该通知仍会发送。第一次实施时情况并非如此。
非常感谢
感谢您的回答。我故意点没有提及订阅/取消订阅部分。我想假设有一个固定的听众。 我的问题是,如果在课堂外暴露同步是明智的。 – 2010-06-17 13:31:21
@Jary Zeels,看到补充回答 – 2010-06-17 13:44:05
感谢阿德里安的澄清,我现在明白了。有一位听众的情况对我来说很清楚。我会考虑更多听众可以注册的情况,因为那样的话,再entrancycan会成为问题。例如,某个通知的侦听器执行某些触发新通知的事件时,您不希望按错误顺序传送事件。我会考虑这个问题,如果需要的话可以回复更多的问题。再次感谢。 – 2010-06-17 14:12:03