java 线程变量的可见性问题

class A{
private boolean run = true;
get/set ...
}

class T1 extends Thread {
private A a;
public T1(A a) {
this.a = a;
}
@Override
public void run() {
while (a.isRun()) {
}
}
}

class T2 extends Thread {
private A a;
public T2(A a) {
this.a = a;
}
@Override
public void run() {
a.setRun(false);
}
}

测试类
A a = new A();
T1 t1 = new T1(a);
T2 t2 = new T2(a);
t1.start();
Thread.sleep(1000);
t2.start();

为什么,线程t2对a 的run属性进行修改,而 线程t1却看不到?

我亲测,是有效的,在T2执行之后,T1就不在执行了