有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我将一个对象传递给一个函数,该函数将一个延迟的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);
}

共 (1) 个答案

  1. # 1 楼答案

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

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

    为什么不直接制作e的本地副本并在不进行同步的情况下处理该副本呢

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

    但也许这是故意的