簡體   English   中英

Java同步將對象傳遞給外來方法

[英]Java synchronized passing object to alien method

我有一個傳遞給函數的對象,該函數將延遲的可運行變量傳遞給處理程序。

我可以在對象傳入和更改時使用lock對象鎖定該對象,但隨后需要將該對象傳遞給“外星人”方法上傳。

如何確保此外來方法上傳不會破壞對象的線程安全性?

它具有從其他地方傳入的對象,而不僅僅是這個延遲線程,因此對象鎖定無效,並且它包含很多功能,因此我擔心使用lock對象鎖定整個調用。

private ContentValues mEvent;
protected final Object mEventLock = new Object();

public void delayFunction(final Values e) {

    // Sanity check
    if (e == null) {
        return;
    }

    synchronized (mEventLock) {
        mEvent = e;
    }

    this.handler.postDelayed(new Runnable() {

        @Override
        public void run() {

            if (prefs != null) {
                final String refs = prefs.getPrefs();
                if (refs != null && refs != "") {

                    log.d("refs field: '%s'", refs);

                    synchronized (mEventLock) {
                        mEvent.remove(refs);
                        mEvent.put(refs, 1);
                    }
                }
            }

            synchronized (mEventLock) {
                // Upload event.
                upload(mEvent);
            }

        }
    }, INSTALL_DELAY);
}

我不確定我是否理解您要在代碼中實現的目標:

  • delayFunction開始通過分配emEvent
  • 然后您修改mEvents
  • 然后您上傳mEvent

您為什么不簡單地制作e的本地副本並在不同步的情況下處理該副本?

此外, mEvent可以通過與另一個線程修改mEvent = e和運行執行,因為你退出synchronized塊:您可運行的客戶將會在另一個工作e ,你會錯過上傳。

但這也許是故意的。

暫無
暫無

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

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