高分求解多线程问题!为何下面这段程序不能结束?class T implements Runnable {boolean f truepublic vo
高分求解多线程问题! 为何下面这段程序不能结束?
class T implements Runnable { boolean f = true;
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)