多線程學習筆記(二)

來源:互聯網
上載者:User

        上一節講到lock鎖,還有一種鎖就是monitor(監視器)

        區別

             lock鎖對鎖定的對象一直要等當前進程全部處理完才能讓其他進程進入。

             monitor鎖可以程式控制解鎖,只是在進程進行某一部分運算時進行上鎖,等運行結束時可以解鎖供其他進程進行運算

             註:錯誤“從不同步的代碼塊中調用了對象同步方法”

                   原因一:monitor鎖住的是實值型別的變數,在monitor.Enter(int i)是對i進行了一次裝箱的過程,而後在monitor.Exit(int i)中又進行了一次裝箱,系統會認為兩次的鎖不是同一個

                  原因二:monitor在代碼中已經釋放,沒有重新申請鎖,而後又調用了monitor.Exit()的方法

                 摘自MSDN:使用 Monitor 鎖定對象(即參考型別)而不是實值型別。將實值型別變數傳遞給 Enter 時,它被裝箱為對象。如果再次將相同的變數傳遞給 Enter,則它被裝箱為一個單獨對象,而且線程不會阻止。Monitor 本應保護的代碼未受保護。此外,將變數傳遞給 Exit 時,也建立了另一個單獨對象。因為傳遞給 Exit 的對象和傳遞給 Enter 的對象不同,Monitor 將引發 SynchronizationLockException。

               

                                                       

                              當一個線程建立完畢就處於就緒狀態等待CPU調度,

                              Enter(),pause(),pauseall(),wait()三個方法

                              一個進程視圖調用一個對象,嘗試給其加上鎖,發現無法加鎖,會進入就緒狀態  

                              Enter()是對一個對象進行加鎖

                              Exit()是線程對這個對象解鎖,但不會通知等待態中的線程進入就緒狀態,如果就緒態中不存線上程則線程會發生死結,因為他不會去調用pause方法將等待態中的線程進入就緒態

                              wait()是線程釋放對象鎖,並進入等待態,也不會通知等待態中的線程進入就緒態

                              pause和pauseall是通知等待態的線程進入就緒態,pause只通知等待態中的第一條線程。

        

                                           

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.