簡體   English   中英

關於束字段的引用注釋

[英]Reference annotation on bundle field

我正在用OSGi開發一個應用程序。 查看OSGi綱要6.0(第112.8.1節),我遇到了聲明性服務; 特別是我看了以下段落:

對於字段,Reference注釋的默認值為:

  • 綁定方法或字段的名稱用於引用的名稱。
  • 如果字段不是集合,則為1:1基數。 如果字段是集合,則為0..n基數。
  • 如果字段未聲明為volatile,則為靜態不情願策略。 動態不情願的策略,如果該字段被聲明為volatile
  • 請求的服務是字段的類型。

例如:

 @Reference volatile Collection<LogService> log; 

現在,我在實踐中閱讀了Neil Bartlett的OSGi(第11.10.2節)Reference annotationbindunbind方法的同步和並發有點棘手(特別是在動態策略scnearios中)。 特別地,通過注釋引用服務的線程安全示例可以是:

@Component( provide = MailboxListener.class, properties = { "service.ranking = 10"})
public class LogMailboxListener implements MailboxListener {
    private final AtomicReference<Log> logRef = newAtomicReference <Log> () ;

    public void messagesArrived ( String mboxName, Mailbox mbox, long [ ] ids ) {
        Log log = logRef.get();
        if (log != null ) 
            log.log(Log.INFO, ids.length + "message(s) arrived in mailbox " + mboxName, null);
        else
            System.err.println("No log available!");
    }

    @Reference( service = Log.class, dynamic = true, optional = true )
    public void setLog(Log log) {
        logRef.set(log);
    }

    public void unsetLog(Log log) {
        logRef.compareAndSet(log, null);
    }
}

我想我從書中抓住了為什么動態策略需要來自多線程場景的這種調整。 我的問題是: 如果參考注釋在一個字段(聲明服務1.3)上,我怎樣才能實現線程安全? 只有將引用定義為“易變”(作為綱要建議)? 或者有一些棘手的部分會在應用程序中產生問題?

謝謝你的回復

在字段上使用動態策略引用時,該字段必須是volatile。 在您的示例中,每次LogServices集更改時,都會向該字段中注入一個新集合。 因此,這將是安全的,因為如果您的代碼迭代舊集合,舊集合將保持不變。 當您的代碼返回到日志字段時,它將看到新的集合。

因此,您需要做的就是聲明字段volatile並且不將字段值存儲在其他位置,因為只要綁定服務集發生更改,字段就會更新為新集合。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM