什么是monitor
什么是monitor
?
monitor直譯過來是監視器的意思,專業一點叫管程。monitor是屬于編程語言級別的,它的出現是為了解決操作系統級別關于線程同步原語的使用復雜性,類似于語法糖,對復雜操作進行封裝。而java則基于monitor機制實現了它自己的線程同步機制,就是synchronized內置鎖。
monitor的作用
?
monitor的作用就是限制同一時刻,只有一個線程能進入monitor框定的臨界區,達到線程互斥,保護臨界區中臨界資源的安全,這稱為線程同步使得程序線程安全。同時作為同步工具,它也提供了管理進程,線程狀態的機制,比如monitor能管理因為線程競爭未能第一時間進入臨界區的其他線程,并提供適時喚醒的功能。
monitor的組成
?
3.1 monitor對象
monitor對象是monitor機制的核心,它本質上是jvm用c語言定義的一個數據類型。對應的數據結構保存了線程同步所需的信息,比如保存了被阻塞的線程的列表,還維護了一個基于mutex的鎖,monitor的線程互斥就是通過mutex互斥鎖實現的。
3.2 臨界區
臨界區是被synchronized包裹的代碼塊,可能是個代碼塊,也可能是個方法。
3.3 條件變量
條件變量和下方wait signal方法的使用有密切關系 。在獲取鎖進入臨界區之后,如果發現條件變量不滿足使用wait方法使線程阻塞,條件變量滿足后signal喚醒被阻塞線程。 tips:當線程被signal喚醒之后,不是從wait那繼續執行的,而是重新while循環一次判斷條件是否成立。參考
3.4 定義在monitor對象上的wait() signal() signalAll()操作
monitorenter操作的目標一定要是一個對象,類型是reference。Reference實際就是堆里的一個存放對象的地址。每個對象(reference)都有一個monitor對應,如果有其它的線程獲取了這個對象的monitor(),當前的線程就要一直等待,直到獲得 monitor的線程放棄monitor,當前的線程才有機會獲得monitor。
如果monitor沒有被任何線程獲取,那么當前線程獲取這個monitor,把monitor的entry count設置為1。表示這個monitor被1個線程占用了.退出monitor時entry count減為0。
當前線程獲取了monitor之后,會增加這個monitor的時間計數,來記錄當前線程占用了monitor多長時間。
總結
以上是生活随笔為你收集整理的什么是monitor的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 10套精美而实用的CSS3按钮
- 下一篇: Mybatis中Mapper标签总结大全