public void run() {
while (f) {
}
}
public void stopRunning() {
f = false;
}
}
public class TestThread {
public static void main(String[] args) throws Exception {
T t = new T();
Thread th = new Thread(t);
th.start();
for (int i = 0; i < 5; i++) {
System.out.println("Alive:" + th.isAlive());
Thread.sleep(10); //这行注释掉程序可以结束
}
t.stopRunning();
}
}
有时人们说,源生类型除了 long 和 double 以外,其他都是“天生线程安全”的,不需要做特别的同步,Effective Java里指出了这种说法的不实之处。
根据Java的规范,除了 long 和 double 之外,其他所有的源生类型的读操作和写操作都有原子性保护,
就是说,在一个多线程的环境下,一个 int 变量即使被不同的线程读/写,
也保证不会出现某个线程读到一个“刚被写了一个字节,其他三个字节还是原来旧的二进制值”的混乱值(arbitrary value)