黑马程序员技术交流社区

标题: 多线程问题 [打印本页]

作者: 刘国涛    时间: 2013-3-20 22:35
标题: 多线程问题
本帖最后由 刘国涛 于 2013-3-21 10:16 编辑

银行有一个金库,有两个储户分别存300元,每次存100,存3次。
class Bank
{
   private int sum;
   public void add(int n)
   {
      sum = sum + n;
      try{Thread.sleep(10);}catch(Exception e){}
      System.out.println("sum="+sum);
   }
}
class Cus implements Runnable
{
   private Bank b = new Bank();
   public void run()
   {  
      for(int x=0; x<3; x++)
      {
         b.add(100);
      }
   }
}
class  BankDemo
{
   public static void main(String[] args)
   {
      Cus c = new Cus();
      Thread t1 = new Thread(c);
      Thread t2 = new Thread(c);
      t1.start();
      t2.start();
   }
}

我没有写同步,但是我想知道代码具体是怎样运行才会得到这个结果的呢?有两个200和两个600,到底是怎么算出来的呢?
作者: 我自信我很牛    时间: 2013-3-20 23:02
这个结果是随即的,其实你只要把握住:线程一旦开始,系统执行哪个线程是随即的,而且所有线程并行,前面两个200,可能是t1先执行方法sum=200,然后她睡了,t2没有得到新的结果,所以也加到了200,所以就会看到两个200的结果了,所以这个结果是不可控的,线程的运行是并行的,进入每个线程都是随机的,而且切换的非常快。
作者: 飞天小猪猪    时间: 2013-3-20 23:09
      sum = sum + n;
      try{Thread.sleep(10);}catch(Exception e){}
      System.out.println("sum="+sum);
这是因为两个线程随机运行,运行到上面代码时出现的问。当t1运行到sum=sum+n; 这时sum=100,这个线程可能会睡眠一下,这时候t2线程也运行到这行代码sum=sum+n;这时候sum就等于200了,然后它打印了一个sum=200出来。这个时候t1线程醒了,它也运行打印代码,也就出现了一个sum=200;这是随机的 比如400出现就是刚好t1和t2出现上面情况。最后的sum=500,和sum=600就是这两个线程没发生上面情况,而是依次运行完。
作者: 刘国涛    时间: 2013-3-21 09:42
多谢楼上两位,已经理解了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2