日期:2014-05-20  浏览次数:20746 次

求大神解答下一个小小的问题,本人刚刚开始自学

为什么会出现这种结果,第一个进程进来之后运行sum=sum+n;然后休眠,然后输出,但它的值不是还是100吗?怎么会有2个200的?
自学 菜鸟

------解决方案--------------------
两个线程是并行的

也就是说两个线程都会运行到

然后等待10毫秒。
也就是说
sum=sum+m;运行了两次,然后等待10毫秒,然后依次输出

如果你对add加锁就可以了
------解决方案--------------------

class Cus implements Runnable {

private Bank bank = new Bank();

@Override
public void run() {
for (int i = 0; i < 3; i++) {
synchronized (this) {// 这里需要加锁,因为你的Bank的实例被多个线程共享了,那么就涉及到多线程抢占资源的问题,应该加锁来达到同步的目的。
bank.add(100);
}
}
}
}

------解决方案--------------------
第一个进程进来之后运行sum=sum+n;此时sum=100。然后休眠;但还没有输出
第二个进程进来时候运行sum=sum+n;此时sum=200.休眠,也没有输出
接着第一个醒后才接着运行输出语句,但这时的sum已经是200了
所以两个都是200
------解决方案--------------------
应该和sleep有关系吧,我也是初学者,Thread t1=new Thread(c)的时候,通过 Runnable创建了一个线程,此线程通过for循环执行3次,第一次被休眠,让出CPU,第二次到sleep也休眠,让出cpu让第一次继续执行,所以是200,后续的原理一样吧。