在JMM下这种在线程之间传递对象的方式是否安全?

时间:2013-09-21 15:22:54

标签: java android multithreading java-memory-model

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

Recent versions of android comply with the JMM

答案 1 :(得分:1)

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