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後就正確,我估計是因為由於加長了主線程的執行時間,導致主線程的緩存被刷新了。