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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© HM何伟 中级黑马   /  2013-4-1 22:32  /  1622 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


/*
银行存款
储户,调用的是银行的存款功能
*/
//当钱存进来时,银行计算总余额功能
class Bank{
        double sum=0;
        public void addMoney(double money)
        {
           synchronized(this)
                {     
                   if (money>0)
               
                        try
                        {        Thread.sleep(20);
                               
                        }
                        catch (Exception e)
                        {
                        }
                        sum+=money;
                  System.out.println(Thread.currentThread().getName()+"总余额"+sum);
                }
        }
}
//人有存钱的功能
class Person implements Runnable{
        Bank b=new Bank();
       
        public void run()
        {        //储存五次,一次存300百,总共存1500.
           for (int i=1;i<=5 ;i++ )
           {
                             b.addMoney(100);
           }
         }
}


class Main{
                 //创建线程,
        public static void main(String[] args){
                  Person p=new Person();
                  Thread t=new Thread(p);
                  //Thread t1=new Thread(p);       
                 // Thread t2=new Thread(p);
                  t.start();
                 // t1.start();
                 // t2.start();
                 }
}
按理说,三个线程与一个线程执行后,出现的结果是一样.才能体现出多线程比单线程高效.

但当我把后面两个线程开启时,怎会钱的数量会出现到1500呢??求解

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

7 个回复

倒序浏览
没有什么问题啊,每个线程都是对同一个Person对象操作的,
所以钱数也是针对同一Person加的,但是因为你对Bank加锁了,
所以。。。和没用多线程效果是一样的。。。
回复 使用道具 举报
我的想是这样的,那里不对,上面的代码中的注是忘了修改的
public void run()
        {        //储存五次,一次存100百,总共存500.
           for (int i=1;i<=5 ;i++ )
           {
                             b.addMoney(100);
           }
         }
可打印的结果是1500
回复 使用道具 举报
我的想是这样的,那里不对,上面的代码中的注是忘了修改的
public void run()
        {        //储存五次,一次存100百,总共存500.
           for (int i=1;i<=5 ;i++ )
           {
                             b.addMoney(100);
           }
         }
可打印的结果是1500
回复 使用道具 举报
若还有问题,继续追问; 没有的话,改成【已解决】哦~
回复 使用道具 举报
原因是这样的:因为person实现了Runnable接口(如示:class Person implements Runnable)所以三个线程使操作的资源是同一个,线程执行后money=500+500+500所以是1500 .
你的要求是打印三个500,那就不能实现Runnable了,就得继承Thread,这样三个线程操作的是各自的资源,打印的结果就是500 ,500, 500
回复 使用道具 举报
田光峰 发表于 2013-4-3 13:46
原因是这样的:因为person实现了Runnable接口(如示:class Person implements Runnable)所以三个线程使操 ...

那这样根本就没体现出多线程的高效性呢
回复 使用道具 举报
再多的线程cpu 一次只能执行一个。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马