在并發(fā)編程中,synchronized關(guān)鍵字是常出現(xiàn)的角色。之前我們都稱呼synchronized關(guān)鍵字為重量鎖,但是在JDK1.6中對(duì)synchronized進(jìn)行了優(yōu)化,引入了偏向鎖、輕量鎖。本篇介紹synchronized關(guān)鍵字的使用方式,區(qū)別和偏向鎖、輕量鎖和重量鎖實(shí)現(xiàn)原理。
成都創(chuàng)新互聯(lián)公司專注于蘄春網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供蘄春營銷型網(wǎng)站建設(shè),蘄春網(wǎng)站制作、蘄春網(wǎng)頁設(shè)計(jì)、蘄春網(wǎng)站官網(wǎng)定制、小程序制作服務(wù),打造蘄春網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供蘄春網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
先看看synchronized關(guān)鍵字的4種用法。
1、修飾普通方法
private synchronized void synMethod(){ }
這種用法中,synchronized鎖的對(duì)象實(shí)例。
2、修飾靜態(tài)方法
private static synchronized void synMethod(){ }
synchronized在這種情況下,鎖的是當(dāng)前Class類對(duì)象。
3、同步方法塊
private void synMethod1(){ synchronized(this){ } } private void synMethod2(){ synchronized(ThreadTest.class){ } }
synMethod1中鎖對(duì)象實(shí)例;synMethod2的是當(dāng)前Class類對(duì)象。
再介紹鎖原理
在介紹鎖原理之前,先認(rèn)識(shí)一下Java對(duì)象頭Mark Word,以32位為例。
鎖狀態(tài) | 25 bit | 4bit | 1bit | 2bit | ||
23bit | 2bit | 是否偏向鎖 | 鎖標(biāo)志位 | |||
輕量級(jí)鎖 | 指向棧中鎖記錄的指針 | 0 | ||||
重量級(jí)鎖 | 指向互斥量(重量級(jí)鎖)的指針 | 10 | ||||
GC標(biāo)記 | 空 | 11 | ||||
偏向鎖 | 線程ID | Epoch | 對(duì)象分代年齡 | 1 | 01 | |
無鎖 | 對(duì)象的hashCode | 對(duì)象分代年齡 | 0 | 01 |
上面的表格中,描述的是對(duì)象在每個(gè)鎖狀態(tài)時(shí),對(duì)象頭中所存儲(chǔ)的信息。
1、偏向鎖
實(shí)際環(huán)境中,線程在訪問同步塊時(shí),如果沒有其他線程對(duì)鎖進(jìn)行競(jìng)爭(zhēng),并且由同一個(gè)線程多次獲得鎖,也就是單線程運(yùn)行同步代碼,在這種情況下,若是每次還阻塞線程,就代表白白浪費(fèi)CPU性能。這種情況下,引入了偏向鎖概念。
可以使用-XX:-userBiasedLocking=false來關(guān)閉JVM偏向鎖優(yōu)化,默認(rèn)直接進(jìn)入輕量鎖。
2、輕量鎖
訪問同步代碼塊時(shí),先在當(dāng)前線程的線程棧中創(chuàng)建一個(gè)鎖記錄(Lock Record)區(qū)域。
把對(duì)象頭Mark Word拷貝到Lock Record中。
利用CAS嘗試將對(duì)象頭Mark Word中的線程指針更新為指向當(dāng)前線程的指針
更新成功,則獲得輕量鎖。
更新失敗,檢查Mark Word中的指針是否指向當(dāng)前線程。
如果是,則說明是鎖的重入現(xiàn)象。執(zhí)行同步代碼塊
如果不是,則說明此時(shí)存在競(jìng)爭(zhēng)。需要把輕量鎖膨脹為重量鎖。
3、重量鎖
重量鎖是基于對(duì)象監(jiān)視器(Monitor)來實(shí)現(xiàn)的。
線程在執(zhí)行同步代碼時(shí),需要調(diào)用一個(gè)Monitor.enter指令。執(zhí)行退出后,調(diào)用Monitor.exit指令。這里看得出,監(jiān)視器具有排它性,一個(gè)時(shí)間點(diǎn)只能有一個(gè)線程enter成功,其他線程只能阻塞在隊(duì)列中。所以這種重量鎖的操作成本很高。
以上所述是小編給大家介紹的Java中的關(guān)鍵字synchronized詳解整合,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)創(chuàng)新互聯(lián)網(wǎng)站的支持!
分享標(biāo)題:Java中的關(guān)鍵字synchronized詳解
轉(zhuǎn)載來源:http://muchs.cn/article12/ghipgc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、軟件開發(fā)、網(wǎng)站建設(shè)、云服務(wù)器、用戶體驗(yàn)、定制開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)