本篇文章為大家展示了如何理解java中鎖與并發(fā),內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。
創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括婁底網(wǎng)站建設(shè)、婁底網(wǎng)站制作、婁底網(wǎng)頁(yè)制作以及婁底網(wǎng)絡(luò)營(yíng)銷(xiāo)策劃等。多年來(lái),我們專(zhuān)注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,婁底網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶(hù)以成都為中心已經(jīng)輻射到婁底省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶(hù)的支持與信任!
在java虛擬機(jī)的實(shí)現(xiàn)中,每個(gè)對(duì)象都有一個(gè)對(duì)象頭,用于保存對(duì)象的系統(tǒng)信息。對(duì)象頭中有一個(gè)稱(chēng)為Mark Word
的部分,它是實(shí)現(xiàn)鎖的關(guān)鍵。在32位系統(tǒng)中,Mark Word
為一個(gè)32位的數(shù)據(jù),在64位系統(tǒng)中,它占64位。它是一個(gè)多功能的數(shù)據(jù)區(qū),可以存放對(duì)象的哈希值、對(duì)象年齡、鎖的指針等信息。一個(gè)對(duì)象是否占用鎖、占用哪個(gè)鎖,就記錄在這個(gè)Mark Word
中。
以32位系統(tǒng)為例,普通對(duì)象的對(duì)象頭如下:
hash: 25 --------->| age: 4 biased_lock: 1 lock: 2
它表示Mark Word
中有25位表示對(duì)象的哈希值,4位表示對(duì)象的年齡,1位表示是否為偏向鎖,2位表示鎖的信息。
偏向鎖是jdk 1.6提出的一種鎖優(yōu)化方式。其核心思想是,如果程序沒(méi)有競(jìng)爭(zhēng),則取消之前已經(jīng)取得鎖的線程同步操作。也就是說(shuō),某一鎖被線程獲取后,就會(huì)進(jìn)入俯身模式,當(dāng)線程再次請(qǐng)求這個(gè)鎖時(shí),無(wú)須再進(jìn)行相關(guān)的同步操作,從而節(jié)省了操作時(shí)間。如果在此期間有其他線程進(jìn)行了鎖請(qǐng)求,則鎖退出偏向模式。在jvm中,使用-XX:+UseBiasedLocking
可以設(shè)置啟用偏向鎖。
對(duì)于偏向鎖的對(duì)象,它的格式如下:
[JavaThread* | epoch | age | 1 | 01]
前23位表示持有偏向鎖的線程,后續(xù)2位表示偏向鎖的時(shí)間戳(epoch
),4位表示對(duì)象年齡,年齡后固定為1,表示偏向鎖,最近2位為01,表示可偏向/未鎖定。
偏向鎖示例:
package jvm.chapter08; import java.util.List; import java.util.Vector; /** * 使用一個(gè)線程對(duì)Vector進(jìn)行寫(xiě)入操作,由于對(duì)Vector的訪問(wèn)內(nèi)部都用同步鎖控制, * 每次add()操作都會(huì)請(qǐng)求numberList對(duì)象的鎖。 * * @author chengyan * @date 2019-11-17 7:41 下午 */ public class Demo01 { public static ListnumberList = new Vector (); public static void main(String[] args) throws InterruptedException { long begin = System.currentTimeMillis(); int count = 0; int startnum = 0; while(count < 1000_0000) { numberList.add(startnum); startnum += 2; count++; } long end = System.currentTimeMillis(); System.out.println(end - begin); } }
使用參數(shù)-XX:+UseBiasedLocking -XX:BiasedLockingStartupDelay=0 -client -Xmx512m -Xms512m
運(yùn)行,結(jié)果如下:
227
這說(shuō)明程序用227毫秒完成所有的工作。參數(shù)-XX:BiasedLockingStartupDelay
表示虛擬機(jī)在啟動(dòng)后立即使用偏向鎖。如不設(shè)置該參數(shù),虛擬機(jī)默認(rèn)會(huì)在啟動(dòng)后4秒后,才啟用偏向鎖,考慮到程序運(yùn)行時(shí)間較短,故做此設(shè)置,盡早啟用偏向鎖。
若禁用偏向鎖,則只需使用如下參數(shù)啟動(dòng)程序:
-XX:-UseBiasedLocking -client -Xmx512m -Xms512m
結(jié)果如下:
363
當(dāng)對(duì)象處于輕量級(jí)鎖時(shí),其中Mark Word
如下(00表示最后2位的值):
[ptr | 00] locked
此時(shí),它指向存放在獲得鎖的線程棧中的該對(duì)象的真實(shí)對(duì)象頭。
當(dāng)對(duì)象處于輕量級(jí)鎖時(shí),其中Mark Word
如下:
[ptr | 10] monitor
此時(shí),最后2位為10,整個(gè) Mark Word
指向 Minitor
的指針。
當(dāng)對(duì)象處理于普通的未鎖定狀態(tài)時(shí),其格式如下:
[header | 0 | 01|] unlocked
前29位表示對(duì)象的哈希值、年齡等信息。倒數(shù)第3位為0,最后兩位為01,表示未鎖定??梢园l(fā)現(xiàn),最后兩位的值和偏向狀態(tài)是一樣的,此時(shí)虛擬機(jī)通過(guò)倒數(shù)第3位來(lái)區(qū)分是否為偏向鎖。
上述內(nèi)容就是如何理解java中鎖與并發(fā),你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。