【问题标题】:Atomicreference in OSGI DS @ReferenceOSGI DS @Reference 中的原子引用
【发布时间】:2016-05-15 10:19:38
【问题描述】:

我正在编写一个包含动态和静态引用的 OSGI 应用程序。每个服务都放在不同的包中。

@Reference (bind = "bindMethod", unbind = "unbindMethod", cardinality = ReferenceCardinality.MANDATORY_UNARY, policy = ReferencePolicy.DYNAMIC)
    private final AtomicReference<TestService> testService = new AtomicReference<TestService>();

@Reference (bind = "bindMethod", unbind = "unbindMethod", cardinality = ReferenceCardinality.MANDATORY_UNARY, policy = ReferencePolicy.DYNAMIC)
    private AtomicReference<TestService> testService = new AtomicReference<TestService>(); //final is ommitted

 protected void bindMethod(TestService atestService)
    {
        if (TestService.get() == null)
        {
            testService.set(atestService);
        }
    }

    protected void unbindMethod(TestService atestService)
    {
        myServices.compareAndSet(testService, null);
    }

没有原子引用

@Reference (bind = "bindMethod", unbind = "unbindMethod", cardinality = ReferenceCardinality.MANDATORY_UNARY, policy = ReferencePolicy.DYNAMIC)
    private TestService testService;

protected void bindMethod(TestService atestService)
    {
        testService = atestService;
    }

    protected void unbindMethod(TestService atestService)
    {
        testService = null;
    }

推荐哪一种,每一种对性能的影响是什么?

【问题讨论】:

    标签: java osgi apache-karaf declarative-services


    【解决方案1】:

    您将@Reference 放在字段上的事实意味着您正在使用具有新字段注入支持的 DS 1.3。

    在这种情况下,您不需要绑定/取消绑定方法,也不需要 AtomicReference。只是:

    @Reference private volatile TestService testService;

    volatile 表示它是一个动态引用,并且还提供适当的并发访问。

    【讨论】:

    • 谢谢哈格雷夫。我将用于启动/停止某些服务的服务。因为有一个原子引用,它在内部使用某种并发逻辑。这个普通的动态服务需要什么并发/同步?当我使用 AtomicReference 而我不使用时,对性能有何影响?
    • 您的评论似乎与 BJ 已经回答的主要问题没有什么不同。
    • 您不需要使用 AtomicReference。 DS 将负责管理字段的值,并且由于它是易变的,因此您将拥有适当的并发行为。
    猜你喜欢
    • 2020-06-08
    • 2021-04-03
    • 2011-10-15
    • 1970-01-01
    • 2013-12-27
    • 2023-04-02
    • 2015-01-15
    • 1970-01-01
    • 2017-10-27
    相关资源
    最近更新 更多