В нашем приложении (написанном на Java для Android) у нас есть производный класс Thread
, который содержит поле int:
public class MyThread extends Thread {
public int myValue = 0;
public void doWork() {
while (true) {
System.out.println(myValue);
}
}
}
// On some other thread
myThread.myValue = 42;
Класс MyThread
только читает из поля int, в то время как я хочу, чтобы другой поток записывал в него (как в примере выше).
Насколько я знаю, примитивные типы, такие как int в Java, читаются/записываются атомарно.
Должен ли я защитить доступ к этому полю int (используя ключевое слово synchronized
)?
Я прочитал здесь, что согласно в модели памяти Java обновления памяти, совместно используемой несколькими потоками, могут даже не отображаться, если не сообщаются явно
Цитата: Без явной связи вы не можете гарантировать, какие записи будут видны другим потокам.
Должен ли я защитить доступ к этому полю или другой поток может обновить его (атомарно) без каких-либо необходимых изменений?
if (value == 42)
. Затем он входит в тело этогоif
, ноvalue
было изменено на что-то другое. Пока вы знаете об этой возможности... Я говорю это, потому что в этих простых примерах, как правило, упускаются многие сложности многопоточности. - person Jonathon Reinhart   schedule 31.10.2013