- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) >
- 如何理解java中鎖與并發(fā)
本篇文章為大家展示了如何理解java中鎖與并發(fā),內容簡(jiǎn)明扼要并且容易理解,絕對能使你眼前一亮,通過(guò)這篇文章的詳細介紹希望你能有所收獲。
在java虛擬機的實(shí)現中,每個(gè)對象都有一個(gè)對象頭,用于保存對象的系統信息。對象頭中有一個(gè)稱(chēng)為Mark Word
的部分,它是實(shí)現鎖的關(guān)鍵。在32位系統中,Mark Word
為一個(gè)32位的數據,在64位系統中,它占64位。它是一個(gè)多功能的數據區,可以存放對象的哈希值、對象年齡、鎖的指針等信息。一個(gè)對象是否占用鎖、占用哪個(gè)鎖,就記錄在這個(gè)Mark Word
中。
以32位系統為例,普通對象的對象頭如下:
hash: 25 --------->| age: 4 biased_lock: 1 lock: 2
它表示Mark Word
中有25位表示對象的哈希值,4位表示對象的年齡,1位表示是否為偏向鎖,2位表示鎖的信息。
偏向鎖是jdk 1.6提出的一種鎖優(yōu)化方式。其核心思想是,如果程序沒(méi)有競爭,則取消之前已經(jīng)取得鎖的線(xiàn)程同步操作。也就是說(shuō),某一鎖被線(xiàn)程獲取后,就會(huì )進(jìn)入俯身模式,當線(xiàn)程再次請求這個(gè)鎖時(shí),無(wú)須再進(jìn)行相關(guān)的同步操作,從而節省了操作時(shí)間。如果在此期間有其他線(xiàn)程進(jìn)行了鎖請求,則鎖退出偏向模式。在jvm中,使用-XX:+UseBiasedLocking
可以設置啟用偏向鎖。
對于偏向鎖的對象,它的格式如下:
[JavaThread* | epoch | age | 1 | 01]
前23位表示持有偏向鎖的線(xiàn)程,后續2位表示偏向鎖的時(shí)間戳(epoch
),4位表示對象年齡,年齡后固定為1,表示偏向鎖,最近2位為01,表示可偏向/未鎖定。
偏向鎖示例:
package jvm.chapter08; import java.util.List; import java.util.Vector; /** * 使用一個(gè)線(xiàn)程對Vector進(jìn)行寫(xiě)入操作,由于對Vector的訪(fǎng)問(wèn)內部都用同步鎖控制, * 每次add()操作都會(huì )請求numberList對象的鎖。 * * @author chengyan * @date 2019-11-17 7:41 下午 */ public class Demo01 { public static List<Integer> numberList = new Vector<Integer>(); 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); } }
使用參數-XX:+UseBiasedLocking -XX:BiasedLockingStartupDelay=0 -client -Xmx512m -Xms512m
運行,結果如下:
227
這說(shuō)明程序用227毫秒完成所有的工作。參數-XX:BiasedLockingStartupDelay
表示虛擬機在啟動(dòng)后立即使用偏向鎖。如不設置該參數,虛擬機默認會(huì )在啟動(dòng)后4秒后,才啟用偏向鎖,考慮到程序運行時(shí)間較短,故做此設置,盡早啟用偏向鎖。
若禁用偏向鎖,則只需使用如下參數啟動(dòng)程序:
-XX:-UseBiasedLocking -client -Xmx512m -Xms512m
結果如下:
363
當對象處于輕量級鎖時(shí),其中Mark Word
如下(00表示最后2位的值):
[ptr | 00] locked
此時(shí),它指向存放在獲得鎖的線(xiàn)程棧中的該對象的真實(shí)對象頭。
當對象處于輕量級鎖時(shí),其中Mark Word
如下:
[ptr | 10] monitor
此時(shí),最后2位為10,整個(gè) Mark Word
指向 Minitor
的指針。
當對象處理于普通的未鎖定狀態(tài)時(shí),其格式如下:
[header | 0 | 01|] unlocked
前29位表示對象的哈希值、年齡等信息。倒數第3位為0,最后兩位為01,表示未鎖定??梢园l(fā)現,最后兩位的值和偏向狀態(tài)是一樣的,此時(shí)虛擬機通過(guò)倒數第3位來(lái)區分是否為偏向鎖。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。
Copyright ? 2009-2021 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 珠海市特網(wǎng)科技有限公司 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站