折騰的。。。。。

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套起來效果不一樣???
而且這裏synchronized的參數寫new Object()也沒有問題。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章