亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

被synchronized修飾,依然出現兩種結果0和6,是我代碼寫得有問題?

public?class?SynchronizedDemo2?{

	private?boolean?ready?=?false;
	private?int?result?=?0;
	private?int?number?=?1;

	public?synchronized?void?write()?{
		ready?=?true;
		number?=?2;
	}

	public?synchronized?void?read()?{
		if?(ready)?{
			result?=?number?*?3;
		}
		System.out.println("result="?+?result);
	}

	private?class?ReadWriteThread?extends?Thread?{
		private?boolean?flag;

		public?ReadWriteThread(boolean?flag)?{
			this.flag?=?flag;
		}

		@Override
		public?void?run()?{
			if?(flag)?{
				write();
			}?else?{
				read();
			}
		}

	}

	public?static?void?main(String[]?args)?{

		for?(int?i?=?0;?i?<?5000;?i++)?{
			SynchronizedDemo2?demo?=?new?SynchronizedDemo2();
			demo.new?ReadWriteThread(true).start();
			demo.new?ReadWriteThread(false).start();
		}

	}

}


正在回答

3 回答

?出現0是因為讀線程先得到了執行,讀線程執行完,寫線程才執行,這個我里面也有講到,你稍微注意下,在“synchronized實現可見性(下)”的第03:30之后!另外,慕課網這點估計剪切的估計太快了,有點不太容易注意到,可以在寫線程和讀線程之間加個休眠操作,讓寫線程執行完,讀線程在執行,也可以使用wait和notify來控制線程執行的順序!

2 回復 有任何疑惑可以回復我~
#1

龍頭老大灬

我認為不是這樣,如果一個對象有多個synchronized方法,只要一個線程訪問了其中的一個synchronized方法,其它線程不能同時訪問這個對象中任何一個synchronized方法,它的問題主要是由于內部鎖發生了變化,把代碼改成這樣應該就沒問題了吧。 SynchronizedDemo2 demo = new SynchronizedDemo2(); for (int i = 0; i < 5000; i++) { demo.new ReadWriteThread(true).start(); demo.new ReadWriteThread(false).start(); }
2015-04-05 回復 有任何疑惑可以回復我~
#2

龍頭老大灬

不好意思,代碼看錯了,你說的們問題,確實是線程執行的順序時間問題
2015-04-05 回復 有任何疑惑可以回復我~
#3

italycappuccino 提問者

thanks~非常感謝!
2015-04-07 回復 有任何疑惑可以回復我~
#4

慕斯卡4106679

這里為什么加了wait和notify會執行寫線程先,再執行讀線程,阻塞狀態怎么會影響順序呢?
2015-12-02 回復 有任何疑惑可以回復我~
#5

慕斯卡4106679 回復 龍頭老大灬

為什么使主線程阻塞,會保證執行順序呢?
2015-12-02 回復 有任何疑惑可以回復我~
查看2條回復

synchronized加入后依然出現0,6的情況是正常的,我覺得假如synchronized是為了防止出現結果登錄3的情況,這里老師沒有講,我也不確定我說的是否是正確的。

1 回復 有任何疑惑可以回復我~

你的內部鎖不是一個了

0 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消

被synchronized修飾,依然出現兩種結果0和6,是我代碼寫得有問題?

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號