Java同步传递对象到外来方法

时间:2012-05-09 17:28:47

标签: java multithreading synchronization locking synchronized

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

我可以在传入对象时锁定对象,并在使用锁定对象更改对象时,然后对象需要传递给“外来”方法上传。

如何确保此异类方法上传不会破坏我对象的线程安全?

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

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

1 个答案:

答案 0 :(得分:0)

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

  • delayFunction首先将e分配给mEvent
  • 然后修改mEvents
  • 然后你上传mEvents

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

此外,mEvent可以被mEvent = e和runnable执行之间的另一个线程修改,因为你退出synchronized块:你的runnable将在另一个e上工作,你将拥有错过了上传。

但也许这是故意的。