【问题标题】:Java synchronized passing object to alien methodJava同步将对象传递给外星人方法
【发布时间】:2012-05-09 17:28:46
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 看起来在简化发布代码时,您犯了一些错误。这些错误使您很难猜测您的实际代码在做什么。
  • “外来方法上传不会破坏我的对象的线程安全”是什么意思?你担心比赛条件吗?能见度问题?
  • 抱歉调整了代码。我担心将对象传递给外部函数,如果我不锁定上传(),延迟函数会再次被调用并更改对象,但是锁定所有上传()调用并一直锁定它似乎很激烈.
  • 这是整个班级还是有其他方法/成员?如果有,发布完整代码是有意义的(除非它真的很长且不相关,但任何使用 mEvent 都是相关的)。
  • 还有其他方法,上传方法我们是公开的,可以从这个类之外获取对象。

标签: java multithreading synchronization locking synchronized


【解决方案1】:

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

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

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

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

但也许这是故意的。

【讨论】:

  • 我研究了复制,但对象没有标准副本,并且 mEvent 没有实现可复制?如果 mEvent 在可运行执行发生之前得到更新是可以的,但如果它发生在删除/更新和上传之间就不行。我应该把所有的跑步都放在街区里吗?这似乎更加极端。
  • 你有指向一些用于 Values / ContentValues 的 javadoc 的链接吗?也许是一个复制构造函数?
  • ContentValues copy = new ContentValues(e);
猜你喜欢
  • 1970-01-01
  • 2019-01-02
  • 1970-01-01
  • 1970-01-01
  • 2015-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
相关资源
最近更新 更多