kingofsocket 2014-07-29 20:01 采纳率: 0%
浏览 227
已采纳

如何使用synchronized使多个线程同步?

有个Bank类, 属性money=0;然后创建三个线程,调用addmoney()往bank里面加钱,
我这样写,为什么不能同步呢 ? 结果不是300万呀?新手请指教.

public class Bank {
private int money=0;

public int getMoney() {
    return money;
}

public void setMoney(int money) {
    this.money = money;
}

public  void addMoney(int money){
    this.money+=money;
}
public void subMoney(int money){
    this.money-=money;
}

}

public class test2 implements Runnable {
private Bank bank;

public test2(Bank bank) {
    this.bank = bank;
}

@Override
public synchronized void run() {
        for (int i = 0; i < 1000; i++) {
            bank.addMoney(1000);
        }
}

public static void main(String[] args) {
    Bank bank = new Bank();
    test2 r1 = new test2(bank);
    test2 r2 = new test2(bank);
    test2 r3 = new test2(bank);
    Thread t1 = new Thread(r1);
    Thread t2 = new Thread(r2);
    Thread t3 = new Thread(r3);
    t1.start();
    t2.start();
    t3.start();
    System.out.println(bank.getMoney());
}

}

  • 写回答

7条回答 默认 最新

  • renminzdb2 2014-07-29 23:23
    关注

    如有我现在用同一个runable实例去构造线程,结果就很明显了。
    [code="java"]Thread t1 = new Thread(r1);
    Thread t2 = new Thread(r1);
    Thread t3 = new Thread(r1);
    t1.start();
    t2.start();
    t3.start();
    System.out.println(bank.getMoney());[/code]
    输出:
    [quote]0
    Thread-0:befor:2014-07-29 11:19:34.000034:$0
    Thread-0:after:2014-07-29 11:19:34.000034:$1000
    Thread-0:befor:2014-07-29 11:19:34.000034:$1000
    Thread-0:after:2014-07-29 11:19:34.000034:$2000
    Thread-0:befor:2014-07-29 11:19:34.000034:$2000
    Thread-0:after:2014-07-29 11:19:34.000034:$3000
    Thread-0:befor:2014-07-29 11:19:34.000034:$3000
    Thread-0:after:2014-07-29 11:19:34.000034:$4000
    Thread-0:befor:2014-07-29 11:19:34.000034:$4000
    Thread-0:after:2014-07-29 11:19:34.000034:$5000
    Thread-0:befor:2014-07-29 11:19:34.000034:$5000
    Thread-0:after:2014-07-29 11:19:34.000034:$6000
    Thread-0:befor:2014-07-29 11:19:34.000034:$6000
    Thread-0:after:2014-07-29 11:19:34.000034:$7000
    Thread-0:befor:2014-07-29 11:19:34.000034:$7000
    Thread-0:after:2014-07-29 11:19:34.000034:$8000
    Thread-0:befor:2014-07-29 11:19:34.000034:$8000
    Thread-0:after:2014-07-29 11:19:34.000034:$9000
    Thread-0:befor:2014-07-29 11:19:34.000034:$9000
    Thread-0:after:2014-07-29 11:19:34.000034:$10000
    Thread-2:befor:2014-07-29 11:19:34.000034:$10000
    Thread-2:after:2014-07-29 11:19:34.000034:$11000
    Thread-2:befor:2014-07-29 11:19:34.000034:$11000
    Thread-2:after:2014-07-29 11:19:34.000034:$12000
    Thread-2:befor:2014-07-29 11:19:34.000034:$12000
    Thread-2:after:2014-07-29 11:19:34.000034:$13000
    Thread-2:befor:2014-07-29 11:19:34.000034:$13000
    Thread-2:after:2014-07-29 11:19:34.000034:$14000
    Thread-2:befor:2014-07-29 11:19:34.000034:$14000
    Thread-2:after:2014-07-29 11:19:34.000034:$15000
    Thread-2:befor:2014-07-29 11:19:34.000034:$15000
    Thread-2:after:2014-07-29 11:19:34.000034:$16000
    Thread-2:befor:2014-07-29 11:19:34.000034:$16000
    Thread-2:after:2014-07-29 11:19:34.000034:$17000
    Thread-2:befor:2014-07-29 11:19:34.000034:$17000
    Thread-2:after:2014-07-29 11:19:34.000034:$18000
    Thread-2:befor:2014-07-29 11:19:34.000034:$18000
    Thread-2:after:2014-07-29 11:19:34.000034:$19000
    Thread-2:befor:2014-07-29 11:19:34.000034:$19000
    Thread-2:after:2014-07-29 11:19:34.000034:$20000
    Thread-1:befor:2014-07-29 11:19:34.000034:$20000
    Thread-1:after:2014-07-29 11:19:34.000034:$21000
    Thread-1:befor:2014-07-29 11:19:34.000034:$21000
    Thread-1:after:2014-07-29 11:19:34.000034:$22000
    Thread-1:befor:2014-07-29 11:19:34.000034:$22000
    Thread-1:after:2014-07-29 11:19:34.000034:$23000
    Thread-1:befor:2014-07-29 11:19:34.000034:$23000
    Thread-1:after:2014-07-29 11:19:34.000034:$24000
    Thread-1:befor:2014-07-29 11:19:34.000034:$24000
    Thread-1:after:2014-07-29 11:19:34.000034:$25000
    Thread-1:befor:2014-07-29 11:19:34.000034:$25000
    Thread-1:after:2014-07-29 11:19:34.000034:$26000
    Thread-1:befor:2014-07-29 11:19:34.000034:$26000
    Thread-1:after:2014-07-29 11:19:34.000034:$27000
    Thread-1:befor:2014-07-29 11:19:34.000034:$27000
    Thread-1:after:2014-07-29 11:19:34.000034:$28000
    Thread-1:befor:2014-07-29 11:19:34.000034:$28000
    Thread-1:after:2014-07-29 11:19:34.000034:$29000
    Thread-1:befor:2014-07-29 11:19:34.000034:$29000
    Thread-1:after:2014-07-29 11:19:34.000034:$30000
    [/quote]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

悬赏问题

  • ¥15 使用C#,asp.net读取Excel文件并保存到Oracle数据库
  • ¥15 C# datagridview 单元格显示进度及值
  • ¥15 thinkphp6配合social login单点登录问题
  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配