java四種鎖機(jī)制 java synchronized鎖對(duì)象,當(dāng)對(duì)象引用是null的時(shí)候,鎖的是什么?
java synchronized鎖對(duì)象,當(dāng)對(duì)象引用是null的時(shí)候,鎖的是什么?謝謝!Java語(yǔ)言規(guī)范明確指出,如果鎖定的對(duì)象為null,則會(huì)發(fā)生NullPointerException。規(guī)范的內(nèi)容
java synchronized鎖對(duì)象,當(dāng)對(duì)象引用是null的時(shí)候,鎖的是什么?
謝謝
!Java語(yǔ)言規(guī)范明確指出,如果鎖定的對(duì)象為null,則會(huì)發(fā)生NullPointerException。規(guī)范的內(nèi)容如下:
表達(dá)式的類(lèi)型必須是引用類(lèi)型,否則會(huì)發(fā)生完全時(shí)間錯(cuò)誤。首先計(jì)算表達(dá)式,執(zhí)行同步語(yǔ)句。然后:如果表達(dá)式的求值由于某種原因完全完成,那么synchronized語(yǔ)句也會(huì)因?yàn)橥瑯拥脑蛲蝗煌瓿?。否則,如果表達(dá)式的值為null,則NullPointerException是指如果某個(gè)線(xiàn)程正在使用此對(duì)象,則其他線(xiàn)程無(wú)法再次使用它。除非它是一個(gè)穩(wěn)定值并且可以被其他線(xiàn)程多次訪問(wèn),否則必須先關(guān)閉它才能使用。
JAVA線(xiàn)程獲取對(duì)象的鎖,其他線(xiàn)程還能修改這個(gè)對(duì)象么?
首先,在Java中同步可以向?qū)ο筇砑踊コ狻?/p>
其次,我們來(lái)談?wù)勍交コ獾膶?shí)現(xiàn)原理。在Java虛擬機(jī)中,synchronized支持的同步方法和同步語(yǔ)句由monitor實(shí)現(xiàn)。每個(gè)對(duì)象都與一個(gè)監(jiān)視器相關(guān)聯(lián)。當(dāng)線(xiàn)程執(zhí)行監(jiān)視器監(jiān)視的代碼塊中的第一條指令時(shí),該線(xiàn)程必須獲得被引用對(duì)象的鎖,該鎖由監(jiān)視器實(shí)現(xiàn)。在hotspot虛擬機(jī)中,監(jiān)視器由objectmonitor實(shí)現(xiàn),用C語(yǔ)言編寫(xiě),具體代碼在hotspot虛擬機(jī)的源代碼中對(duì)象監(jiān)視器.hpp文件。
如果查看源代碼,您會(huì)發(fā)現(xiàn)主要屬性是uCount(記錄線(xiàn)程獲取鎖的次數(shù))Recursions(鎖重入次數(shù))Owner(指向持有objectmonitor對(duì)象的線(xiàn)程)Waitset(線(xiàn)程集處于等待狀態(tài))Entrylist(線(xiàn)程隊(duì)列等待鎖塊)。
當(dāng)并發(fā)線(xiàn)程執(zhí)行同步修飾的方法或語(yǔ)句塊時(shí),它首先進(jìn)入entrylist中的,當(dāng)線(xiàn)程獲得對(duì)象的監(jiān)視器時(shí),owner變量設(shè)置為當(dāng)前線(xiàn)程,監(jiān)視器對(duì)象中的計(jì)數(shù)器計(jì)數(shù)加1,當(dāng)前線(xiàn)程成功獲取同步鎖。
當(dāng)同步修飾的方法或語(yǔ)句塊中的線(xiàn)程調(diào)用wait()方法時(shí),當(dāng)前線(xiàn)程將釋放保留的監(jiān)視器對(duì)象,同時(shí),uCount值減1,然后當(dāng)前線(xiàn)程進(jìn)入waitset集合中的Waiting等待喚醒。