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