2

我有一个看起来像这样的可选服务依赖项:

@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() 运行时服务变得未绑定,我有问题,对吗?我需要在所有这些功能中添加同步块,还是有更好的方法来处理这种情况?

4

1 回答 1

2

您不需要使用同步原子引用。我通常建议对具有动态策略的 DS 引用使用原子引用。

话虽如此,您的代码存在两个问题:

  1. testServiceRef字段从未初始化。您应该在构建过程中对其进行初始化,并在理想情况下使其final.
  2. 的实现unsetTestService不正确。在动态服务替换期间,“新”服务的绑定发生“旧”服务的解除绑定之前。因此,您需要检查未绑定的服务是否实际上是您当前绑定的服务。你可以通过调用来做到这一点testServiceRef.compareAndSet(testService, null)
于 2015-05-07T10:12:27.387 回答