Java将对象同步传递到外部方法

Java将对象同步传递到外部方法,java,multithreading,synchronization,locking,synchronized,Java,Multithreading,Synchronization,Locking,Synchronized,我将一个对象传递给一个函数,该函数将一个延迟的runnable传递给一个处理程序 我可以在对象传入和使用lock对象更改时锁定该对象,但随后该对象需要传递到“alien”方法 如何确保此外来方法上载不会破坏对象的线程安全 它有从别处传入的对象,不仅仅是这个延迟线程,所以对象锁无效,它包含了很多功能,所以我关心的是用锁对象锁定整个调用 private ContentValues mEvent; protected final Object mEventLock = new Object(); p

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

我可以在对象传入和使用lock对象更改时锁定该对象,但随后该对象需要传递到“alien”方法

如何确保此外来方法上载不会破坏对象的线程安全

它有从别处传入的对象,不仅仅是这个延迟线程,所以对象锁无效,它包含了很多功能,所以我关心的是用锁对象锁定整个调用

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通过将e分配给mEvent开始 然后修改mEvents 然后你上传我的事件 你为什么不简单地制作一个e的本地副本,然后在没有同步的情况下处理这个副本呢

此外,mEvent可能会被mEvent=e和runnable执行之间的另一个线程修改,因为您退出了synchronized块:您的runnable将在另一个e上工作,并且您将错过上载


但这可能是故意的。

在简化发布代码时,您似乎犯了一些错误。这些错误让你很难猜到你的实际代码在做什么。你说外星方法上传不会破坏我的对象的线程安全是什么意思?你担心比赛条件吗?可见性问题?道歉调整了代码。我担心将的对象传递给外部函数,如果我不锁定upload,会再次调用delayFunction并更改对象,但如果我不锁定upload,那么锁定所有upload调用并将其一直锁定似乎很激烈。这是整个类还是有其他方法/成员?如果有的话,发布完整的代码是有意义的,除非它确实很长而且不相关,但是mEvent的任何使用都是相关的。还有其他方法,upload方法us public,可以从这个类之外获取对象。我研究了复制,但是没有对象的标准副本,mEvent没有实现可复制?如果mEvent在可运行执行之前得到更新,这是可以的,但如果它发生在删除/更新和上载之间,则不可以。我应该把所有的跑步都放在街区里吗?这似乎更极端。您是否有指向某些javadoc的值/内容值链接?也许是一个复制构造函数?是不是ContentValues:ContentValues copy=newcontentvaluese;