JAVA同步化中wait和notify問題? ((拜託

小弟在JAVAWORD上發了一個問題

可是....

有人回答但小弟不懂他說的問題在哪?

想來請教一下...

是否有人看得懂它的意思呢@@?

可以的話是否能順便幫幫小弟了~

非常感謝您了~

http://www.javaworld.com.tw/jute/post/view?bid=29&...

已更新項目:

先感謝大大您的回答~

可是小弟有試過= ="

它有可能出現這樣的結果說

Before notify

After notify

Before Waiting

...

其中一段改成:

Thread.sleep(1000);//讓主執行緒先睡著不讓他先拿到Test.class進入synchronized

synchronized (Test.class) {// 主執行緒拿著Test.class這個鎖進入

//另一個執行緒先拿到Test.class這個鎖進入synchronized

會發生最後After Waiting和Total is : + r.tota不會印出來

2 個已更新項目:

抱歉大大....

// 主執行緒拿著Test.class這個鎖進入

改成

//主執行緒剛睡著Test.class鎖被另一個執行緒搶走了....

3 個已更新項目:

Test.class 同一類別的靜態鎖不是都是一樣的嗎@@?

小弟試過除非是使用new來建立不同物件才是不同的鎖....

而相同的類別的靜態鎖只有一個說~

有請大大您請教了~拜託大大了

小弟會非常感謝...

感激不盡了><"

4 個已更新項目:

非常感謝大大了><"

1 個解答

評分
  • 吉他
    Lv 5
    10 年前
    最佳解答

    那個高手問你輸出的結果為什麼是

    Before Waiting....

    Before

    notify....

    After notify....

    After Waiting....

    你自己也沒發現嗎,你是不已經在兩段程式裡都用了synchronized (Test.class)這一行之後才System.out.println()

    如果照你的想法來解釋這段程式,他的執行結果應該會是

    Before notify....

    After notify...

    Before Waiting....

    最後的After Waiting....和Total is :" + r.tota不會印出來,

    但是要發生這個情形除非你lock的是同一個物件。

    所以重點再於你去lock的並不是你一開始建立出來的Test r = new Test();

    這個物件,而是去lock他們Test.class這個靜態類別,所以以你現在的程式來說並沒有同步化的功能,

    而是多緒的分開獨立在跑。

    同步的程式是不可能發生

    Before Waiting....

    Before

    notify....

    After notify....

    這種結果的,因為你的out出來的結果都包在synchroniez裡,

    要嘛就同一段out都印完,不可能會穿插的印出來!

    After Waiting....

    2010-04-24 21:57:03 補充:

    我剛找了一下資料,並且試了幾次,更正並補充一些觀念,你lock的是同一個物件沒錯,但是當一個物件被lock的時候,此物件會在此時就會讓自己的monter可以讓別的物件去取到之後並notify。

    而你說的發生

    Before notify

    After notify

    Before Waiting

    這是因為先執行了test01物件裡的run,他先執行了,並且跑完notify,才去執行main的同步那段,造成Before Waiting這裡執行完之後會一直wait。

    2010-04-24 22:02:16 補充:

    我覺得你寫的沒錯,只是你寫的太複雜,我幫你整理一下。

    你的程式兩段共用同一個物件 Test.class的monitor。

    情形1(正常情況):

    main裡的先取到Test.class的monitor時會在wait停住,然後會等到Test 也取到Test.class的monitor並且notify之後,main裡的程式才會繼續走。

    情形2(死結):

    Test 裡的run先執行了,Test 先取到Test.class的monitor並且notify,然後main 本身也是thread,main取到Test.class的monitor時會在wait停住,程式卡死。

    參考資料: java 吉他手
    • 登入以對解答發表意見
還有問題?馬上發問,尋求解答。