class MaiPiao implements Runnable
{
private int num=1;//此類只建了一個對象,每個線程調的是同一個對象,不會重複同樣的num
Object b=new Object();
public void run()
{
synchronized(new Object())//也試過直接用b,效果是不同的
{
for (;num<=1000;num++)
{
System.out.println(this.getName()+"賣出: "+num+" 號票");
}
}
}
}
class PiaoDemo
{
public static void main(String[] args)
{
MaiPiao d=new MaiPiao();
new Thread(d,"窗口A").start();//Runnable子類對象傳給新建線程對象
new Thread(d,"窗口B").start();
new Thread(d,"窗口C").start();
}
}
synchronized的參數寫new Object()時,運行結果有1002行,就是說某兩張票是重複的,並且經多次試驗,重複的票號都是靠前的數字。無論設定張數改多少,輸出總是比它多兩行。
像這樣:
窗口A賣出: 1 號票窗口A賣出: 2 號票窗口A賣出: 3 號票窗口A賣出: 4 號票
重複票窗口B賣出: 4 號票
重複票窗口B賣出: 6 號票
重複票窗口B賣出: 7 號票窗口A賣出: 5 號票窗口B賣出: 8 號票窗口C賣出: 6 號票
重複票窗口B賣出: 10 號票窗口A賣出: 9 號票窗口B賣出: 12 號票窗口C賣出: 11 號票
而像老師視頻那樣synchronized的參數裏寫前面new好的b時,就只有A一個線程運行,輸出1000行,程序結束。
怎麼回事啊!!!!!
多番試驗,決定全抄老師的代碼試試,他是run裏先while再鎖再if,其他都一樣,結果就成功了
public void run()
{
while(true)
{
synchronized(b)
{
if(num<=1000)
{
System.out.println(Thread.currentThread().getName()+"賣出:"+(num++)+" 號票");
}
}
}
}
爲什麼while套起來效果不一樣???