我正在努力做出决定.我正在编写一个线程安全的库/ API.可以注册监听器,以便在发生有趣的事情时通知客户端.这两种实现中哪一种最常见?
class MyModule {
protected Listener listener;
protected void somethingHappens() {
synchronized(this) {
... do useful stuff ...
listener.notify();
}
}
}
Run Code Online (Sandbox Code Playgroud)
要么
class MyModule {
protected Listener listener;
protected void somethingHappens() {
Listener l = null;
synchronized(this) {
... do useful stuff ...
l = listener;
}
l.notify();
}
}
Run Code Online (Sandbox Code Playgroud)
在第一个实现中,在同步内通知侦听器.在第二种实现中,这是在同步之外完成的.
我觉得建议使用第二个,因为它减少了潜在的死锁空间.但我很难说服自己.
第二个实现的缺点是客户端可能会收到"不正确"的通知,如果它在l.notify()语句之前访问并更改了模块,则会发生这种情况.例如,如果它要求模块停止发送通知,则无论如何都会发送此通知.在第一个实现中不是这种情况.
非常感谢