Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在JMM下,这种在线程之间传递对象的方式安全吗?_Java_Android_Multithreading_Java Memory Model - Fatal编程技术网

Java 在JMM下,这种在线程之间传递对象的方式安全吗?

Java 在JMM下,这种在线程之间传递对象的方式安全吗?,java,android,multithreading,java-memory-model,Java,Android,Multithreading,Java Memory Model,我正在寻找一种将对象从后台线程传递到UI线程的安全方法。下面的代码安全吗 // on background thread final HugeObject object = constructHugeObjectFromDatabaseAndNetwork(); uiThreadHandler.post(new Runnable() { public void run() { doSomethingWithObject(object); } }); 也就是说,JMM规则是否允许在do

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

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

也就是说,JMM规则是否允许在doSomethingWithObject调用期间部分构造对象?另外,JMM与Android及其虚拟机的相关性如何?

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

在实践中,使用发布消息,在代码和将在UI上发生的对象之间创建“发生在之前”关系


.

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