写了一个关于多线程的一段测试代码:
public class MultiThreadTest {
public static void main(String[] args) {
Some som = new Some();
Runnable run = () -> {
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
som.stop();
};
new Thread(run).start();
som.doSome();
System.out.println("end");
}
static class Some{
private boolean isStop = false;
void doSome(){
System.out.println("start");
while (true){
if(isStop){
break;
}
}
System.out.println("done");
}
void stop(){
isStop = true;
}
}
}
输出结果是什么呢?我预想的是:
start
done
end
可实际的情况是执行完 start
之后,就会无限等待下去。
start
也就是说,在主线程执行的while循环一直在进行,在while中的 isStop
并没有因为另一个线程的赋值而改变。
如果把它想成是一个简单的Java多线程同步的问题的话,就很好解决了。问题原因是:当子线程修改了共享变量的值以后,虽然写入到了主内存
,但是主线程的工作内存并没有及时刷新,取到的值还是旧的,所以导致无限等待下去。解决方式就多种多样了 volatile
、synchronized
都可以,比如:
private volatile boolean isStop = false; // 保证多线程可见性
这样就可以稳定输出 start
done
end
当时并没有往多线程同步上去考虑,所以一直没找到问题。还是得多写多练啊
网友评论