static 的num的数值增加了1000,同时也减少了1000,之后还sleep了1秒,在这1面只能num的数值已经处理完,所以最终输出还是0
解决方案 »
- 在MyEclipse里面调用Dll的方法。报Exception in thread "main" java.lang.UnsatisfiedLinkError
- 偶买嘎的!继续struts2+spring整合问题!!虚心求教!
- lucence 检索数据匹配为 0
- struts2怎么实现表单数据保存
- 求run.bat文件写运行jar包,依赖的jar包如何写?
- spring一个问题非常感谢
- 求助,平台选择。。。
- javax.xml.namespace.QName 哪里能下载?
- 请问有哪位大虾知道可以免费下载(既不需付费又不需注册)电影的站点,请告知小弟好吗?谢谢!
- 如何关闭jb7中的历史记录功能
- 关于二级缓存
- SPRINGMVC有关疑问
public class Main {
public static volatile int num = 0;
public static void main(String [] args){
Thread thread = new Thread(){
@Override
public void run() {
int i = 10000;
while(i-- > 0){
num++;
}
};
};
Thread thread2 = new Thread(){
@Override
public void run() {
int i = 10000;
while(i-- > 0){
num--;
}
}
};
thread.start();
thread2.start();
try {
Thread.sleep(1000); //等待线程执行
} catch (InterruptedException e) {
}
System.out.println("Final: " + num);
}
}
因为你的程序中两个线程各自操作缓存中的变量,最后才刷回主存,所以永远是0.
可以了解下java内存模型,指令重排序,网上资料不少。
Final: 604
Final: 268
Final: 394
我又试着跑了下我的代码,发现各种结果都有可能:10000,-10000,0甚至是乱码。所以我觉得应该是JAVA内存模型有好几种执行方案分别起了作用?(确实对内存模型不是很懂,正在看...)
结论就是一定要对共享的数据做同步。
谢谢你的答案!
我又试着跑了下我的代码,发现各种结果都有可能:10000,-10000,0甚至是乱码。所以我觉得应该是JAVA内存模型有好几种执行方案分别起了作用?(确实对内存模型不是很懂,正在看...)
结论就是一定要对共享的数据做同步。
谢谢你的答案!粗略看了一下,我的解释的确有问题,线程调度机制太复杂,我也不明白。总之我们知道如何肯定能产生正确的结果就行了,对于可能出现的错误,有时候经过精心的构造也未必能出现。