続き。volatile の必要性については、参照側

int prevA = 0;

while (true) {
  Vars v = Vars.instance;
  if (v.a != prevA) {
    doSomething(v);
    prevA = v.a;
  }
}

とすると、参照側の Vars.instance のアクセスがキャッシュされるから、
Vars.instance は volatile じゃないと駄目ってことでしょ。

Vars.instance を直接アクセスせずに getter を介してれば volatile は不要、かな?