public class Machine implements Runnable{
private int a=0;
public void run(){
for(a=0;a<50;a++){
System.out.println(Thread.currentThread().getName()+":"+a);
try{
Thread.sleep(100);
}catch(InterruptedException e){throw new RuntimeException(e);}
}
}
public static void main(String args[]){
Machine machine=new Machine();
Thread t1=new Thread(machine);
Thread t2=new Thread(machine);
t1.start();
t2.start();
}
} 这个打印结果为什么a=0有2次?
private int a=0;
public void run(){
for(a=0;a<50;a++){
System.out.println(Thread.currentThread().getName()+":"+a);
try{
Thread.sleep(100);
}catch(InterruptedException e){throw new RuntimeException(e);}
}
}
public static void main(String args[]){
Machine machine=new Machine();
Thread t1=new Thread(machine);
Thread t2=new Thread(machine);
t1.start();
t2.start();
}
} 这个打印结果为什么a=0有2次?
解决方案 »
- 内部类一个问题求解!!
- BufferReader读完文件后怎么重新定位到文件起始位置
- 如何在局域网中搭建web服务器环境
- 数组实现了List接口吗?
- 炒股的朋友来帮帮忙,我想抓取收盘价
- java中mai函数必须定义在主类或者主类的子类中,才能被执行么?mai函数定义的位置有什么要求?
- java如何获取并处理ping命令返回在cmd窗口里的信息?
- JNI中,c中方法如何得到java传来的中文字符串?
- 写了一段小代码输出验证码图片,出现了问题。请大神指点
- 你设置一个接口 里面的方法传出参数为类A, 现在你需要传出一个A的子类(如B)。有办法可以实现吗?
- 分享:解决后台接受前台中文信息乱码的问题
- String format问题
Thread t1=new Thread(machine);
Thread t2=new Thread(machine);首先他们还没开始的时候。t1、t2首先拿的都是machine这个对象中的a 的值。
所以这个时候如果往外打印,肯定都是0了。当他们都开始循环的时候,就开始一个一个累加了。并且这里a是machine的。
所以2个线程对一个线程变量累加(说多了。、)楼下反编译一个。
有的告诉我。。
至于为什么一开始输出的是两个0:
“一个线程打印了0,后睡眠,另一个线程依然从0开始打印,所以两次。”
这也是二楼说的,不过二楼后半部分说法感觉有点问题
因为你的代码根本就没有涉及到线程互斥
后续的输出无法预测,甚至有些a的值打印不出来
要互斥必须加锁public class Machine implements Runnable{
private int a=0;
private Object object=new Object();
public void run(){
synchronized (object) {
for(a=0;a<50;a++){
System.out.println(Thread.currentThread().getName()+":"+a);
try{
Thread.sleep(100);
}catch(InterruptedException e){throw new RuntimeException(e);}
}
}
}
public static void main(String args[]){
Machine machine=new Machine();
Thread t1=new Thread(machine);
Thread t2=new Thread(machine);
t1.start();
t2.start();
}
}
for(a=0;a<50;a++){
System.out.println(Thread.currentThread().getName()+":"+a);
try{
Thread.sleep(100);
}catch(InterruptedException e){throw new RuntimeException(e);}
}
顶四楼,前几天刚看了资料,就是这样解释的。因为你的共享资源没有加锁,cpu对线程的切换时随机的,它是以语句为单位,随时都有可能中断去执行另外的线程。