程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程解疑 >> java-求助個Java多線程的demo問題

java-求助個Java多線程的demo問題

編輯:編程解疑
求助個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循環內添加一條輸出語句,程序也是正常的,求解是什麼問題

最佳回答:


public int getTimes() {
return times;
}
//times非volatile的,因此主線程調用該方法的時候,並不會要求刷新緩存,所以執行到 if (f.getTimes() >= 2) 的時候,條件一直不滿足。
你將times的定義加上volatile看下就對了。
至於為何debug或則加上sysout後就正確,我估計是因為由於加長了主線程的執行時間,導致主線程的緩存被刷新了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved