Зависит от того, что не существует явной гарантии того, что изменение состояния будет немедленно отражено в исходном потоке, в первую очередь потому, что исходный поток может иметь кэшированную копию значения x
, которая не будет обновлена, когда другой потокизменяет значение x
в основной памяти.
Вы можете обойти это, добавив явную гарантию, используя ключевое слово volatile
, например:
class State {
private volatile int x;
public State(int y) { x = y; }
public void setX(int y) { x = y; }
public int getX() { return x; }
}
Это говорит компилятору, чтоон не может кэшировать значение x
и каждый раз, когда программа читает x
, он должен проверять значение, находящееся в основной памяти.Это приведет к тому, что исходный поток увидит новое значение x
, как только любой другой поток изменит его.
Подробнее здесь:
http://www.javamex.com/tutorials/synchronization_volatile.shtml