圆周率_ 2016-03-04 11:52 采纳率: 100%
浏览 1413
已采纳

求助个Java多线程的demo问题

public class ThreadDemo {

public static void main(String[] args) {
    new ThreadDemo().run();
}

public void run() {
    Family f = new Family();
    new Thread(f, "qizi").start();
    new Thread(f, "zhangfu").start();
    while (true) {
        if (f.getTimes() >= 2) {
            f.show();
            break;
        }
    }

}



class Family implements Runnable {
    private int saveMoney;
    private int getMoney;
    private int curMoney;// 当前取的钱
    private int times = 0;

    // 可以直接创建一个对象来作为同步锁的钥匙
    Object key = new Object();

    public Family() {
        saveMoney = 10000;
        getMoney = 2000;
        curMoney = 0;
    }

    public int getTimes() {
        return times;
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        getMoney();
    }

    // 同步方法,默认使用this作为钥匙
    public synchronized void getMoney() {
        System.out.println(Thread.currentThread().getName() + "qule" + getMoney);
        curMoney += getMoney;
        int temp = saveMoney - getMoney;
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        saveMoney = temp;
        times++;
        //System.out.println(times);
    }

    public void show() {
        System.out.println("yinhanghaiyou" + saveMoney + "jialihaiyou" + curMoney);
    }

}

}


正常运行的时候会卡死在while循环那里,Debug模式下正常,如果在while循环内添加一条输出语句,程序也是正常的,求解是什么问题

  • 写回答

3条回答

  • broust 2016-03-07 06:09
    关注

    public int getTimes() {
    return times;
    }
    //times非volatile的,因此主线程调用该方法的时候,并不会要求刷新缓存,所以执行到 if (f.getTimes() >= 2) 的时候,条件一直不满足。
    你将times的定义加上volatile看下就对了。
    至于为何debug或则加上sysout后就正确,我估计是因为由于加长了主线程的执行时间,导致主线程的缓存被刷新了。

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

报告相同问题?

悬赏问题

  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘