Java基本概念監(jiān)視器實(shí)習(xí)原理解析
大學(xué)有一門課程叫操作系統(tǒng),學(xué)習(xí)過的同學(xué)應(yīng)該都記得,監(jiān)視器是操作系統(tǒng)實(shí)現(xiàn)同步的重要基礎(chǔ)概念,同樣它也用在JAVA的線程同步中,這篇文章用一種類推的思想解釋監(jiān)視器”monitor”。
1.什么是監(jiān)視器
監(jiān)視器可以看做是經(jīng)過特殊布置的建筑,這個(gè)建筑有一個(gè)特殊的房間,該房間通常包含一些數(shù)據(jù)和代碼,但是一次只能一個(gè)消費(fèi)者(thread)使用此房間,
當(dāng)一個(gè)消費(fèi)者(線程)使用了這個(gè)房間,首先他必須到一個(gè)大廳(Entry Set)等待,調(diào)度程序?qū)⒒谀承?biāo)準(zhǔn)(e.g. FIFO)將從大廳中選擇一個(gè)消費(fèi)者(線程),進(jìn)入特殊房間,如果這個(gè)線程因?yàn)槟承┰虮弧皰炱稹保鼘⒈徽{(diào)度程序安排到“等待房間”,并且一段時(shí)間之后會(huì)被重新分配到特殊房間,按照上面的線路,這個(gè)建筑物包含三個(gè)房間,分別是“特殊房間”、“大廳”以及“等待房間”。
簡(jiǎn)單來說,監(jiān)視器用來監(jiān)視線程進(jìn)入這個(gè)特別房間,他確保同一時(shí)間只能有一個(gè)線程可以訪問特殊房間中的數(shù)據(jù)和代碼。
2.JAVA中監(jiān)視器的實(shí)現(xiàn)
在JAVA虛擬機(jī)中,每個(gè)對(duì)象(Object和class)通過某種邏輯關(guān)聯(lián)監(jiān)視器,為了實(shí)現(xiàn)監(jiān)視器的互斥功能,每個(gè)對(duì)象(Object和class)都關(guān)聯(lián)著一個(gè)鎖(有時(shí)也叫“互斥量”),這個(gè)鎖在操作系統(tǒng)書籍中稱為“信號(hào)量”,互斥(“mutex “)是一個(gè)二進(jìn)制的信號(hào)量。
如果一個(gè)線程擁有了某些數(shù)據(jù)的鎖,其他的線程則無法獲得鎖,直到這個(gè)線程釋放了這個(gè)鎖。在多線程中,如果任何時(shí)候都是我們自己來寫這個(gè)信號(hào)量,顯然不是很方便,幸運(yùn)的是,JVM為我們自動(dòng)實(shí)現(xiàn)了這些。
為了使數(shù)據(jù)不被多個(gè)線程訪問,java 提供了同步塊 以及 同步方法兩種實(shí)現(xiàn),一旦一段代碼被嵌入到一個(gè)synchronized關(guān)鍵字中,意味著放入了監(jiān)視區(qū)域,JVM在后臺(tái)會(huì)自動(dòng)為這段代碼實(shí)現(xiàn)鎖的功能。
3.JAVA的同步代碼中,哪一部分是監(jiān)視器?
我們知道JAVA每個(gè)對(duì)象(Object/class) 都關(guān)聯(lián)一個(gè)監(jiān)視器,更好的說法應(yīng)該是每個(gè)對(duì)象(Object/class)都有一個(gè)監(jiān)視器,對(duì)象可以有它自己的臨界區(qū),并且能夠監(jiān)視線程序列為了使線程協(xié)作,JAVA為提供了wait()和notifyAll以及notify()實(shí)現(xiàn)掛起線程,并且喚醒另外一個(gè)等待的線程,此外這些方法有三種不同版本:
wait(long timeout, int nanos)wait(long timeout) notified by other threads or notified by timeout.notify(all)
這些方法只能在一個(gè)同步塊或同步方法中被調(diào)用,原因是,如果一個(gè)方法不需要相互排斥,不需要監(jiān)測(cè)或線程之間協(xié)作,每一個(gè)線程可以自由訪問此方法,那就不需要協(xié)作。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
