Я мог бы найти ответ, если бы прочитал полную главу/книгу о многопоточности, но мне нужен более быстрый ответ. (Я знаю, что этот вопрос о переполнении стека похож, но недостаточно.)
Предположим, что существует этот класс:
public class TestClass {
private int someValue;
public int getSomeValue() { return someValue; }
public void setSomeValue(int value) { someValue = value; }
}
Есть два потока (A и B ), которые обращаются к экземпляру этого класса. Рассмотрим следующую последовательность:
Если я прав, someValue должен быть volatile, иначе 3-й шаг может не вернуть значение даты от -до -(, потому что A может иметь кэшированное значение ). Это верно?
Второй сценарий:
В этом случае A всегда будет получать правильное значение, потому что это его первый доступ, поэтому он еще не может иметь кэшированное значение. Это правильно?
Если к классу обращаются только вторым способом,нет необходимости в volatile/синхронизации, или нет?
Обратите внимание, что этот пример был упрощен, и на самом деле меня интересуют конкретные переменные-члены и методы в сложном классе, а не целые классы (, т.е. какие переменные должны быть изменчивыми или иметь синхронизированный доступ ). Суть в том, :, если больше потоков обращается к определенным данным, нужен ли синхронизированный доступ во что бы то ни стало, или это зависит от способа (, например. порядок )они получают к нему доступ?
Прочитав комментарии, я пытаюсь представить источник моего замешательства на другом примере:
threadA.start()
getSomeValue()
и информирует поток пользовательского интерфейсаthreadB.start()
setSomeValue()
и информирует поток пользовательского интерфейсаgetSomeValue()
Это полностью синхронизированная структура, но почему это означает, что threadA получит наибольшее значение даты от -до -на шаге 6? (, если someValue
не изменчиво или не помещается в монитор при доступе из любого места)