1

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

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

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

4

2 回答 2

1

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

在实践中,处理程序使用线程安全(同步)的消息队列来发布消息,在您的代码和您的对象在 UI 上发生的任何事情之间创建发生前的关系。

最新版本的 android 符合 JMM

于 2013-09-22T03:27:11.147 回答
1

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

于 2013-09-22T03:35:37.897 回答