考虑以下来自http://www.knopflerfish.org/osgi_service_tutorial.html#best解释白板模式的代码片段
ServiceListener sl = new ServiceListener() {
public void serviceChanged(ServiceEvent ev) {
ServiceReference sr = ev.getServiceReference();
switch(ev.getType()) {
case ServiceEvent.REGISTERED:
{
registerServlet(sr);
}
break;
case ServiceEvent.UNREGISTERING:
{
unregisterServlet(sr);
}
break;
}
}
};
String filter = "(objectclass=" + HttpServlet.class.getName() + ")";
try {
bc.addServiceListener(sl, filter); // -- 1
ServiceReference[] srl = bc.getServiceReferences(null, filter); // -- 2
for(int i = 0; srl != null && i < srl.length; i++) {
sl.serviceChanged(new ServiceEvent(ServiceEvent.REGISTERED,
srl[i]));
}
} catch (InvalidSyntaxException e) {
e.printStackTrace();
}
是否有可能在 line-1 和 line-2 之间复制 ServiceEvent.REGISTERED 事件?在第 1 行和第 2 行之前注册服务侦听器后,服务注册自身,导致侦听器接收 ServiceEvent.REGISTERED 通知。在所有服务引用中的第 2 行是对该服务的引用,导致通知被接收两次。这种情况可能吗?如果是,那么可以做些什么来避免这种情况?