2013-09-21 6 views
1

Я ищу безопасный способ передать объект из фонового потока в поток пользовательского интерфейса. Предоставляет ли код ниже безопасное?Этот способ передачи объектов между потоками безопасен под JMM?

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

Т.е., не JMM правила позволяют объекту быть на самом деле частично построенными во время вызова doSomethingWithObject? Кроме того, насколько релевантно JMM для Android и его виртуальной машины?

ответ

1

Да - обработчики должны делать именно это: обмен информацией по потокам безопасным потоком.

На практике handlers использует thread safe (synchronized) message queue для публикации сообщений, создавая взаимосвязь между вашим кодом и случаем в пользовательском интерфейсе с вашим объектом.

Recent versions of android comply with the JMM.

1

Это зависит от реализации post(). В закодированном коде нет барьера памяти, поэтому он, как правило, не будет потокобезопасным. Но на практике становится очень сложно иметь один поток, ожидающий выполнения задачи без использования барьера для обмена объектами. Это, вероятно, будет иметь место здесь, и если так, то это будет безопасно.

Смежные вопросы