问各位一个问题:例如: private static int number=0; public static void add(){
number++;
} private static final int MAX_COUNT=10;
public static void main(String [] args){
Thread [] threads=new Thread[MAX_COUNT];
for(Thread t:threads){
t=new Thread(new Runnable() {
public void run() {
for(int i=0;i<100;i++){
add();
}
}
});
t.start();
}
while(Thread.activeCount()>1)Thread.yield();
System.out.println(number);
}由于没有使用同步 所以在同时运行add()方法的线程可能会不止一个,
然则number++的操作并非原子操作:
在使用javap 之后看到其对应的指令为:
//静态成员number压入操作数堆栈
0: getstatic #13 // Field number:I
//创建一个临时变量
3: iconst_1
4: iadd
//静态成员number出栈放到常量解析池
5: putstatic #13 // Field number:I
由此我的看法是 “number++” 有四条指令,一定不会是一个原子性操作(一条指令都未必是原子性操作...)一个方法中多个线程都在操作,并且没法保证修改变量操作的原子性.那么为什么每次都还能得到正确的值呢?
莫非是编译时候有过优化?
number++;
} private static final int MAX_COUNT=10;
public static void main(String [] args){
Thread [] threads=new Thread[MAX_COUNT];
for(Thread t:threads){
t=new Thread(new Runnable() {
public void run() {
for(int i=0;i<100;i++){
add();
}
}
});
t.start();
}
while(Thread.activeCount()>1)Thread.yield();
System.out.println(number);
}由于没有使用同步 所以在同时运行add()方法的线程可能会不止一个,
然则number++的操作并非原子操作:
在使用javap 之后看到其对应的指令为:
//静态成员number压入操作数堆栈
0: getstatic #13 // Field number:I
//创建一个临时变量
3: iconst_1
4: iadd
//静态成员number出栈放到常量解析池
5: putstatic #13 // Field number:I
由此我的看法是 “number++” 有四条指令,一定不会是一个原子性操作(一条指令都未必是原子性操作...)一个方法中多个线程都在操作,并且没法保证修改变量操作的原子性.那么为什么每次都还能得到正确的值呢?
莫非是编译时候有过优化?
解决方案 »
- MyEclipse哪个版本好用啊,请大家指点?谢谢!
- 请问一下,Struts2 的标签怎么会自带表格??
- 什么是数据字典,我查了例子,还是有点蒙,请帮忙予以解说。谢谢。
- 火大了 hibernate 设置sequence 问题
- 根据一个目录的目录结构,用Jdom 递归生成该目录结构的xml文件
- 送分,谈谈接口 抽象接口 抽象类区别,拒绝复制粘贴,欢迎来聊聊。
- BeanPostProcessor配置遇到的问题.
- [200分]急问:hibernate中hbm文件中inverse是什么功能,设成true和false有什么区别,和cascade怎样配合使用!
- hibernate 多表插入记录的问题
- jsp或servlet中有没有办法统计在线用户(通过session数目)的ip地址、、等信息
- 后台怎么通知前台
- spring mvc 关于在controller中获取request
结果帖子刚发完没两分钟,就来了个97000000。