繁体   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