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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杜成龙 中级黑马   /  2013-6-11 18:03  /  1587 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杜成龙 于 2013-6-12 18:57 编辑
  1. class Bank
  2. {
  3.        private int sum;
  4.        public void add(int n)
  5.        {
  6.              sum=sum+n;
  7.              System.out.println("sum="+sum);
  8.        }
  9. }
  10. class Cus implements Runnable
  11. {
  12.       private Bank b=new Bank();
  13.       public void run()
  14.      {
  15.           for(int x=0;x<3;x++)
  16.           {
  17.                b.add(100);
  18.           }
  19.      }
  20. }
  21. class BankDemo
  22. {
  23.       public static void main(String[] args)
  24.      {
  25.           Cus c=new Cus();
  26.           Thread t1=new Thread(c);
  27.           Thread t2=new Thread(c);
  28.           t1.start();
  29.           t2.start();
  30.     }
  31. }
复制代码
这个程序的运行结果是:
sum=100
sum=300
sum=400
sum=200
sum=500
sum=600  
问题是我的程序中不是两个线程共同执行run方法中的内容吗?怎么会输出六个数呢?不应该是三个吗?求解答,谢谢啦!



评分

参与人数 1技术分 +1 收起 理由
夜默 + 1

查看全部评分

5 个回复

倒序浏览
你用Thread创建了两个对象,每一个对象分别使用run方法,然后每一个run方法分别执行3次循环,一共就是六次,没有错。

评分

参与人数 1技术分 +1 收起 理由
夜默 + 1

查看全部评分

回复 使用道具 举报
你创建了两个线程对象,假设为线1和线2。当线1和线2启动start()方法后,两个线程开始抢夺资源,谁先抢到谁就先执行run()方法里的循环,有两个线程所以会执行6次。但是若想出现三次运行结果,在本程序中你得考虑到线程安全问题.可以利用同步代码块或JKD1.5后LOCK解决,因为你程序块中有线程共享数据。

评分

参与人数 1技术分 +1 收起 理由
夜默 + 1

查看全部评分

回复 使用道具 举报
楼主你好  如果帖子的问题已经解决,请把帖子的类型改为“已解决”。
回复 使用道具 举报
加个锁就好了
回复 使用道具 举报
每次run方法后都有三个sum,你创建了两个线程,每个线程运行一次run方法,你算一算结果就是6个sum
OK?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马