【问题标题】:Is this way of passing objects between threads safe under JMM?这种在线程之间传递对象的方式在 JMM 下是否安全?
【发布时间】:2013-09-21 15:22:53
【问题描述】:

我正在寻找一种将对象从后台线程传递到 UI 线程的安全方法。下面的代码安全吗?

// on background thread
final HugeObject object = constructHugeObjectFromDatabaseAndNetwork();
uiThreadHandler.post(new Runnable() { 
    public void run() { doSomethingWithObject(object); }
});

即,JMM 规则是否允许在 doSomethingWithObject 调用期间实际上部分构造对象?此外,JMM 与 Android 及其虚拟机的相关性如何?

【问题讨论】:

    标签: java android multithreading java-memory-model


    【解决方案1】:

    是的 - 处理程序正是为了做到这一点:以线程安全的方式跨线程交换信息。

    在实践中,handlers 使用 thread safe (synchronized) message queue 发布消息,在您的代码与您的对象在 UI 上发生的任何事情之间创建发生前的关系。

    Recent versions of android comply with the JMM.

    【讨论】:

      【解决方案2】:

      这取决于post()的实现。引用的代码中没有内存屏障,因此它通常不是线程安全的。但是,实际上,在不使用屏障交换对象的情况下让一个线程等待任务运行变得非常困难。这里很可能就是这种情况,如果是这样,那就安全了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-15
        相关资源
        最近更新 更多