Потоки 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" является потокобезопасным. Здесь вы можете найти подробную информацию о состоянии гонки

Другие вопросы по тегам