Безопасен ли этот способ передачи объектов между потоками в JMM?

Я ищу безопасный способ передать объект из фонового потока в поток пользовательского интерфейса. Код ниже делает это безопасно?

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

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


person Fixpoint    schedule 21.09.2013    source источник


Ответы (2)


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

На практике обработчики используйте потокобезопасный (синхронизированная) очередь сообщений для отправки сообщений, создавая отношение «происходит до» между вашим кодом и тем, что произойдет в пользовательском интерфейсе с вашим объектом.

Последние версии Android соответствуют JMM.

person assylias    schedule 22.09.2013

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

person erickson    schedule 22.09.2013