public class Sample
{
private int number;
public synchronized void increase()
{
if(0 != number)
{
try
{
wait();
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
number++;
System.out.println(number);
notify();
}
public synchronized void decrease()
{
if(0 == number)
{
try
{
wait();
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
number--;
System.out.println(number);
notify();
}
}
Thread t1 = new IncreaseThread(sample);
Thread t2 = new DecreaseThread(sample)
Thread t3 = new IncreaseThread(sample);
Thread t4 = new DecreaseThread(sample);
先说说怎么改:你只需要把if,改为while.notify改为notifyAll。就行了。
再说说你的为什么会乱:假如这种情况,当开始0 == number时,执行 if(0 == number)的时候,你的t2,t4个线程执行number--时,你会发现他们都在if中wait()了。然后 t1 线程执行 if(0 != number)时,t1就把t2的唤醒,然后t1也wait(),现在还能有执行权的是t2和t3。然后t3执行,因为现在number=1。所以t3,也wait()。现在就剩t2了。
注意:由于t2执行时,就会把t4唤醒,由于是if条件语句,t4就不会去判断if(0 == number)。所有t4就会继续执行下去。所以执行了2次number--。所以你的程序就乱了。
最后说说为什么这么改:由上面分析,你应该知道,t4唤醒时,还要去判断下,所以if就改为while。但用while是,会出现死锁。所以就把notify,改为notifyAll。因为每个线程唤醒时,都会去判断条件,所有之后就不会乱了。
|