Потоки Java, обращающиеся к полю Объекта
Я получил вопрос в интервью, спрашивая, как показано ниже:
В Java объект, имеющий поле, как указано ниже...
public class MyObject
{
int count=0;
public synchronized void m()
{
for(int j=0; j< 1000; j++)
{
System.out.println(Thread.currentThread().getName()+"-> "+j);
count++;
}
System.out.println(Thread.currentThread().getName()+" completed ->"+count);
}
}
Здесь к полю "count" обращаются в синхронизированном методе, и поле не объявлено как volatile.
Каково будет реальное поведение, если Поток t1 обращается к методу m(), который синхронизируется и использует внутри него поле "count", и одновременно другой Поток t2 пытается напрямую получить доступ к полю "count"?
2 ответа
t1
будет иметь видимость самой современной стоимости count
сбрасывается в основную память, читая ее, когда она входит в synchronized
блокировать и записывать обратно, когда он уходит; значение, которое он печатает в конце, всегда будет на 1000 больше, чем значение, которое он прочитал.
t2
будет читать значение count
в какой-то момент; разрешено сохранять кэшированное значение. Любые обновления значения count могут быть сброшены в основную память немедленно, позже или никогда.
Там будет состояние гонки. Поскольку ТОЛЬКО метод "m" является потокобезопасным. Здесь вы можете найти подробную информацию о состоянии гонки