В вашем примере ключевое слово volatile
только гарантирует, что последняя ссылка, записанная любым потоком в 'm', будет видна любому потоку, читающему 'm' впоследствии.
Это не гарантируетчто-нибудь о вашем get () .
Таким образом, используя следующую последовательность:
Thread-1: get() returns 2
Thread-2: set(3)
Thread-1: get()
для вас вполне законно вернуться 2, а не 3. volatile
ничего не меняет на это.
Но если вы измените свой класс Mutable
на этот:
class Mutable {
private volatile int value;
public int get()
{
return a;
}
public int set(int value)
{
this.value = value;
}
}
Тогда гарантируется, что второй get()
из Thread-1должен вернуть 3.
Обратите внимание, однако, что volatile
обычно не лучший метод синхронизации.
В вашем простом примере get / set (я знаю, это всего лишь пример) класс, подобный AtomicInteger
, используя правильную синхронизацию и фактически предоставляя полезные методы, было бы лучше.