java世界的鎖原語
1.park/unpark
unpark
????public static?void?unpark(Threadthread)
????thread?- the thread to unpark, or?null, in which case this operation has no effect
park
????public static?void?park(Objectblocker)
????Disables the current thread for thread scheduling purposes unless the permit is available.
該原語由posix的條件變量實(shí)現(xiàn)
該原語主要用于配合CAS指令實(shí)現(xiàn)JUC(Java Util Concurrency)的Lock 和Semaphore,而這些Lock又用于實(shí)現(xiàn)JUC里面的各種高級(jí)數(shù)據(jù)結(jié)構(gòu),效率很高腰奋,令人驚嘆灌危。
2.對(duì)象內(nèi)置鎖
Java世界還有一種更通用的鎖是對(duì)象內(nèi)置鎖蔓挖。存儲(chǔ)在ObjectHeader中咽扇,如下圖:
通過字節(jié)碼我們可以發(fā)現(xiàn),修飾在方法層面的同步關(guān)鍵字,會(huì)多一個(gè) ACC_SYNCHRONIZED的flag涣狗;修飾在代碼塊層面的同步塊會(huì)多一個(gè) monitorenter和 monitorexit關(guān)鍵字镀迂。無論采用哪一種方式作煌,本質(zhì)上都是對(duì)一個(gè)對(duì)象的監(jiān)視器(monitor)進(jìn)行獲取心褐,而這個(gè)獲取的過程是排他的斑胜,也就是同一個(gè)時(shí)刻只能有一個(gè)線程獲得同步塊對(duì)象的監(jiān)視器者冤。
在?synchronized的原理分析這篇文章中拜银,有提到對(duì)象監(jiān)視器庶喜。
synchronized關(guān)鍵字經(jīng)過編譯之后,會(huì)在同步塊的前后分別形成monitorenter和monitorexit這兩個(gè)字節(jié)碼指令秩冈。當(dāng)我們的JVM把字節(jié)碼加載到內(nèi)存的時(shí)候,會(huì)對(duì)這兩個(gè)指令進(jìn)行解析入问。這兩個(gè)字節(jié)碼都需要一個(gè)Object類型的參數(shù)來指明要鎖定和解鎖的對(duì)象稀颁。如果Java程序中的synchronized明確指定了對(duì)象參數(shù),那么這個(gè)對(duì)象就是加鎖和解鎖的對(duì)象棱烂;如果沒有明確指定,那就根據(jù)synchronized修飾的是實(shí)例方法還是類方法颊糜,獲取對(duì)應(yīng)的對(duì)象實(shí)例或Class對(duì)象來作為鎖對(duì)象
Java1.6以后芭析,對(duì)monitorenter關(guān)鍵字進(jìn)行了優(yōu)化吞瞪,出現(xiàn)了偏向鎖,輕量級(jí)鎖惯疙,重量級(jí)鎖,自旋等優(yōu)化
ObjectMonitor僅代表重量級(jí)鎖霉颠,即會(huì)被調(diào)度程序調(diào)度的鎖,JVMTI中的MonitorContendedEnter等函數(shù)應(yīng)該指的是進(jìn)入了重量級(jí)鎖的callback函數(shù)