首先,Java中synchronized可以實(shí)現(xiàn)對(duì)對(duì)象加互斥鎖。
其次,我們來聊一聊synchronized互斥鎖的實(shí)現(xiàn)原理。Java虛擬機(jī)中,synchronized支持的同步方法和同步語句都是使用monitor來實(shí)現(xiàn)的。每個(gè)對(duì)象都與一個(gè)monitor相關(guān)聯(lián),當(dāng)一個(gè)線程執(zhí)行到一個(gè)monitor監(jiān)視下的代碼塊中的第一個(gè)指令時(shí),該線程必須在引用的對(duì)象上獲得一個(gè)鎖,這個(gè)鎖是monitor實(shí)現(xiàn)的。在HotSpot虛擬機(jī)中,monitor是由ObjectMonitor實(shí)現(xiàn),使用C++編寫實(shí)現(xiàn),具體代碼在HotSpot虛擬機(jī)源碼ObjectMonitor.hpp文件中。查看源碼會(huì)發(fā)現(xiàn),主要的屬性有_count(記錄該線程獲取鎖的次數(shù))、_recursions(鎖的重入次數(shù))、_owner(指向持有ObjectMonitor對(duì)象的線程)、_WaitSet(處于wait狀態(tài)的線程集合)、_EntryList(處于等待鎖block狀態(tài)的線程隊(duì)列)。當(dāng)并發(fā)線程執(zhí)行synchronized修飾的方法或語句塊時(shí),先進(jìn)入_EntryList中,當(dāng)某個(gè)線程獲取到對(duì)象的monitor后,把monitor對(duì)象中的_owner變量設(shè)置為當(dāng)前線程,同時(shí)monitor對(duì)象中的計(jì)數(shù)器_count加1,當(dāng)前線程獲取同步鎖成功。當(dāng)synchronized修飾的方法或語句塊中的線程調(diào)用wait()方法時(shí),當(dāng)前線程將釋放持有的monitor對(duì)象,monitor對(duì)象中的_owner變量賦值為null,同時(shí),monitor對(duì)象中的_count值減1,然后當(dāng)前線程進(jìn)入_WaitSet集合中等待被喚醒。