A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘国涛 中级黑马   /  2013-3-20 22:35  /  1378 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘国涛 于 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,到底是怎么算出来的呢?

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

3 个回复

倒序浏览
这个结果是随即的,其实你只要把握住:线程一旦开始,系统执行哪个线程是随即的,而且所有线程并行,前面两个200,可能是t1先执行方法sum=200,然后她睡了,t2没有得到新的结果,所以也加到了200,所以就会看到两个200的结果了,所以这个结果是不可控的,线程的运行是并行的,进入每个线程都是随机的,而且切换的非常快。
回复 使用道具 举报
      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就是这两个线程没发生上面情况,而是依次运行完。

评分

参与人数 1技术分 +1 收起 理由
scott0610 + 1 赞一个!

查看全部评分

回复 使用道具 举报
多谢楼上两位,已经理解了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马