日期:2014-05-20 浏览次数:20925 次
public class ViolentAccessDemo {
public static void main(String[] args) {
ViolentObject violentObject = new ViolentObject();
Thread thread1 = new Thread(new ThreadAccess(violentObject));
Thread thread2 = new Thread(new ThreadAccess(violentObject));
thread1.start();
thread2.start();
for(int i=0;i<10;i++){
violentObject.print();
try{
Thread.sleep(500);
}catch(InterruptedException e){}
}
}
}
class ViolentObject{
private int x;
private int y;
private int z;
private int a;
public void increase(){ //这里输出的值是不一样,因为
//x++ 在刚被执行完之后,就退出时间片,而下次进来的线程又重新执行x++。
//那么肯定地说x的值加到最后,必然是最大的。可是事实上,并不是如此。
//加最一个synchronized是不是保证这句代码被执行完解锁,再退出CPU时间片。
//很不解。
x++;
y++;
z++;
a++;
}
public void print(){
System.out.println("x="+x+",y="+y+",z="+z+",a="+a);
}
}
class ThreadAccess implements Runnable{
private ViolentObject violentObject;
public ThreadAccess(ViolentObject violentObject){
this.violentObject = violentObject;
}
public void run(){
while(true) violentObject.increase();
}
}
1 ALOAD 0 2 DUP 3 GETFIELD ViolentObject.x : I 4 ICONST_1 5 IADD 6 PUTFIELD ViolentObject.x : I
------解决方案--------------------