下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第Java必會的Synchronized底層原理剖析目錄1.synchronized作用2.synchronized用法3.synchronized加鎖原理synchronized作為Java程序員最常用同步工具,很多人卻對它的用法和實(shí)現(xiàn)原理一知半解,以至于還有不少人認(rèn)為synchronized是重量級鎖,性能較差,盡量少用。
但不可否認(rèn)的是synchronized依然是并發(fā)首選工具,連volatile、CAS、ReentrantLock都無法動搖synchronized的地位。synchronized是工作面試中的必備技能,今天就跟著一燈一塊深入剖析synchronized的底層原理。
1.synchronized作用
synchronized是Java提供一種隱式鎖,無需開發(fā)者手動加鎖釋放鎖。保證多線程并發(fā)情況下數(shù)據(jù)的安全性,實(shí)現(xiàn)了同一個時刻只有一個線程能訪問資源,其他線程只能阻塞等待,簡單說就是互斥同步。
2.synchronized用法
先看一下synchronized有哪幾種用法?
使用位置被鎖對象示例代碼實(shí)例方法實(shí)例對象publicsynchronizedvoidmethod(){
}靜態(tài)方法class類publicstaticsynchronizedvoidmethod(){
}實(shí)例對象實(shí)例對象publicvoidmethod(){
Objectobj=newObject();
synchronized(obj){
}
}類對象class類publicvoidmethod(){
synchronized(Demo.class){
}
}this關(guān)鍵字實(shí)例對象publicvoidmethod(){
synchronized(this){
}
}
可以看到被鎖對象只要有兩種,實(shí)例對象和class類。
由于靜態(tài)方法可以通過類名直接訪問,所以它跟直接加鎖在class類上是一樣的。當(dāng)在實(shí)例方法、實(shí)例對象、this關(guān)鍵字上面加鎖的時候,鎖定范圍都是當(dāng)前實(shí)例對象。實(shí)例對象上面的鎖和class類上面的鎖,兩者不互斥。
3.synchronized加鎖原理
當(dāng)我們使用synchronized在方法和對象上加鎖的時候,Java底層到底怎么實(shí)現(xiàn)加鎖的?
當(dāng)在類對象上加鎖的時候,也就是在class類加鎖,代碼如下:
/**
*@author一燈架構(gòu)
*@apiNoteSynchronized示例
publicclassSynchronizedDemo{
publicvoidmethod(){
synchronized(SynchronizedDemo.class){
System.out.println("Helloworld!");
反編譯一下,看一下源碼實(shí)現(xiàn):
可以看到,底層是通過monitorenter和monitorexit兩個關(guān)鍵字實(shí)現(xiàn)的加鎖與釋放鎖,執(zhí)行同步代碼之前使用monitorenter加鎖,執(zhí)行完同步代碼使用monitorexit釋放鎖,拋出異常的時候也是用monitorexit釋放鎖。
寫成偽代碼,類似下面這樣:
/**
*@author一燈架構(gòu)
*@apiNoteSynchronized示例
publicclassSynchronizedDemo{
publicvoidmethod(){
try{
monitorenter加鎖;
System.out.println("Helloworld!");
monitorexit釋放鎖;
}catch(Exceptione){
monitorexit釋放鎖;
當(dāng)在實(shí)例方法上加鎖,底層是怎么實(shí)現(xiàn)的呢?代碼如下:
/**
*@author一燈架構(gòu)
*@apiNoteSynchronized示例
publicclassSynchronizedDemo{
publicstaticsynchronizedvoidmethod(){
System.out.println("Helloworld!");
再反編譯看一下底層實(shí)現(xiàn):
這次只使用了一個ACC_SYNCHRONIZED關(guān)鍵字,實(shí)現(xiàn)了隱式的加鎖與釋放鎖。其實(shí)無論是ACC_SYNCHRONIZED關(guān)鍵字,還是monitorenter和monitorexit,底層都是通過獲取monitor鎖來實(shí)現(xiàn)的加鎖與釋放鎖。
而monitor鎖又是通過ObjectMonitor來實(shí)現(xiàn)的,虛擬機(jī)中ObjectMonitor數(shù)據(jù)結(jié)構(gòu)如下(C++實(shí)現(xiàn)的):
ObjectMonitor(){
_header=NULL;
_count=0;//WaitSet和EntryList的節(jié)點(diǎn)數(shù)之和
_waiters=0,
_recursions=0;//重入次數(shù)
_object=NULL;
_owner=NULL;//持有鎖的線程
_WaitSet=NULL;//處于wait狀態(tài)的線程,會被加入到_WaitSet
_WaitSetLock=0;
_Responsible=NULL;
_succ=NULL;
_cxq=NULL;//多個線程爭搶鎖,會先存入這個單向鏈表
FreeNext=NULL;
_EntryList=NULL;//處于等待鎖block狀態(tài)的線程,會被加入到該列表
_SpinFreq=0;
_SpinClock=0;
OwnerIsThread=0;
圖上展示了ObjectMonitor的基本工作機(jī)制:
當(dāng)多個線程同時訪問一段同步代碼時,首先會進(jìn)入_EntryList隊(duì)列中等待。當(dāng)某個線程獲取到對象的Monitor鎖后進(jìn)入臨界區(qū)域,并把Monitor中的_owner變量設(shè)置為當(dāng)前線程,同時Monitor中的計(jì)數(shù)器_count加1。即獲得對象鎖。若持有Monitor的線程調(diào)用wait()方法,將釋放當(dāng)前持有的Monitor鎖,_owner變量恢復(fù)為null,_count減1,同時該線程進(jìn)入_WaitSet集合中等待被喚醒。在_WaitSet集合中的線程會被再次放到_EntryList隊(duì)列中,重新競爭獲取鎖。若當(dāng)前線程執(zhí)行完畢也將釋放Monitor并復(fù)位變量的值,以便其他線程進(jìn)入獲取鎖。
線程爭搶鎖的過程要比上面展示得更加復(fù)雜。除了
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年浙江工業(yè)大學(xué)之江學(xué)院高職單招職業(yè)適應(yīng)性測試備考試題及答案詳細(xì)解析
- 外貿(mào)實(shí)習(xí)生培訓(xùn)
- 2026年廣東建設(shè)職業(yè)技術(shù)學(xué)院單招綜合素質(zhì)考試備考試題含詳細(xì)答案解析
- 代理記賬公司培訓(xùn)
- 2026年天津電子信息職業(yè)技術(shù)學(xué)院單招綜合素質(zhì)筆試備考試題含詳細(xì)答案解析
- 2026中國林業(yè)科學(xué)研究院高原林業(yè)研究所招聘職能部門綜合管理輔助崗位人員1人考試重點(diǎn)試題及答案解析
- 2026年福建工程學(xué)院單招綜合素質(zhì)筆試模擬試題含詳細(xì)答案解析
- 2026年河南質(zhì)量工程職業(yè)學(xué)院單招職業(yè)技能考試參考題庫含詳細(xì)答案解析
- 2026年成都銀杏酒店管理學(xué)院高職單招職業(yè)適應(yīng)性測試備考題庫及答案詳細(xì)解析
- 2026年柳州職業(yè)技術(shù)學(xué)院單招綜合素質(zhì)筆試備考題庫含詳細(xì)答案解析
- 安全目標(biāo)管理制度煤廠(3篇)
- 云南省玉溪市2025-2026學(xué)年八年級上學(xué)期1月期末物理試題(原卷版+解析版)
- 車輛駕駛員崗前培訓(xùn)制度
- 2026年哈爾濱通河縣第一批公益性崗位招聘62人考試參考試題及答案解析
- 就業(yè)協(xié)議書解約函模板
- 招聘會會展服務(wù)投標(biāo)方案(技術(shù)標(biāo) )
- 高考英語3500單詞表(帶音標(biāo))(亂序版)默寫背誦通用版
- 馬超-水田省力化劑型的開發(fā)及應(yīng)用研究-
- 頭面部的神經(jīng)阻滯課件
- 友達(dá)光電(昆山)有限公司第一階段建設(shè)項(xiàng)目環(huán)?!叭瑫r”執(zhí)行情況報(bào)告
- 光學(xué)下擺拋光技術(shù)培訓(xùn)教材
評論
0/150
提交評論