我有一个可选的服务依赖项,如下所示:
@Component
class TestComponent {
private AtomicReference<TestService> testServiceRef;
@Reference(type = '?')
protected void setTestService(TestService testService) {
testServiceRef.set(testService);
}
protected void unsetTestService(TestService testService) {
testServiceRef.set(null);
}
public void doStuff() {
TestService testService = testServiceRef.get();
if (testService != null)
testService.performSomeTask();
}
}
现在,如果服务在testService.performSomeTask()运行时被解除绑定,我有一个问题,对吗?我是否需要在所有这些功能中添加同步块,还是有更好的方法来处理这种情况?
答案 0 :(得分:2)
您不需要使用同步和原子引用。我通常建议对具有动态策略的DS引用使用原子引用。
话虽如此,您的代码存在两个问题:
testServiceRef
字段。您应该在构建期间对其进行初始化,最好将其设为final
。unsetTestService
的实施不正确。在动态服务替换期间,“新”服务的绑定在“旧”服务解除绑定之前发生。因此,您需要检查未绑定的服务是否实际上是您当前绑定的服务。您可以致电testServiceRef.compareAndSet(testService, null)
。