0

我有一个对象传递给一个函数,该函数将延迟的可运行对象传递给处理程序。

我可以在对象被传入和使用锁定对象更改对象时锁定它,但随后需要将对象传递给“外星人”方法上传。

如何确保这种外来方法上传不会破坏我的对象的线程安全?

它有从其他地方传入的对象,而不仅仅是这个延迟线程,所以对象锁是无效的,它包含很多功能,所以我担心用锁对象锁定整个调用。

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);
}
4

1 回答 1

0

我不确定我是否理解您要在代码中实现的目标:

  • delayFunction首先分配emEvent
  • 然后你修改 mEvents
  • 然后你上传 mEvents

为什么不简单地制作一个本地副本e并在不同步的情况下处理该副本?

此外,由于您退出同步块,mEvent因此可能会被另一个线程修改,mEvent = e因为您退出了同步块:您的可运行对象将在另一个线程上工作e,您将错过上传。

但也许这是故意的。

于 2012-05-09T17:47:21.400 回答