我正在寻找一种将对象从后台线程传递到UI线程的安全方法。下面的代码安全吗?
// on background thread
final HugeObject object = constructHugeObjectFromDatabaseAndNetwork();
uiThreadHandler.post(new Runnable() {
public void run() { doSomethingWithObject(object); }
});
即,在doSomethingWithObject调用期间,JMM规则是否允许对象实际上是部分构造的?此外,JMM与Android及其虚拟机的相关性如何?
答案 0 :(得分:1)
是的 - 处理程序可以做到这一点:以线程安全的方式跨线程交换信息。
在实践中,handlers使用thread safe (synchronized) message queue发布消息,在您的代码与您的对象在UI上发生的任何事情之间建立事后关系。
答案 1 :(得分:1)
这取决于post()
的实施。引用的代码中没有内存屏障,因此它通常不是线程安全的。但是,在实践中,让一个线程等待任务运行而不使用屏障来交换对象变得非常困难。这可能是这种情况,如果是这样,那将是安全的。