您好,登錄后才能下訂單哦!
本篇文章為大家展示了如何理解java中鎖與并發,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
在java虛擬機的實現中,每個對象都有一個對象頭,用于保存對象的系統信息。對象頭中有一個稱為Mark Word
的部分,它是實現鎖的關鍵。在32位系統中,Mark Word
為一個32位的數據,在64位系統中,它占64位。它是一個多功能的數據區,可以存放對象的哈希值、對象年齡、鎖的指針等信息。一個對象是否占用鎖、占用哪個鎖,就記錄在這個Mark Word
中。
以32位系統為例,普通對象的對象頭如下:
hash: 25 --------->| age: 4 biased_lock: 1 lock: 2
它表示Mark Word
中有25位表示對象的哈希值,4位表示對象的年齡,1位表示是否為偏向鎖,2位表示鎖的信息。
偏向鎖是jdk 1.6提出的一種鎖優化方式。其核心思想是,如果程序沒有競爭,則取消之前已經取得鎖的線程同步操作。也就是說,某一鎖被線程獲取后,就會進入俯身模式,當線程再次請求這個鎖時,無須再進行相關的同步操作,從而節省了操作時間。如果在此期間有其他線程進行了鎖請求,則鎖退出偏向模式。在jvm中,使用-XX:+UseBiasedLocking
可以設置啟用偏向鎖。
對于偏向鎖的對象,它的格式如下:
[JavaThread* | epoch | age | 1 | 01]
前23位表示持有偏向鎖的線程,后續2位表示偏向鎖的時間戳(epoch
),4位表示對象年齡,年齡后固定為1,表示偏向鎖,最近2位為01,表示可偏向/未鎖定。
偏向鎖示例:
package jvm.chapter08; import java.util.List; import java.util.Vector; /** * 使用一個線程對Vector進行寫入操作,由于對Vector的訪問內部都用同步鎖控制, * 每次add()操作都會請求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
這說明程序用227毫秒完成所有的工作。參數-XX:BiasedLockingStartupDelay
表示虛擬機在啟動后立即使用偏向鎖。如不設置該參數,虛擬機默認會在啟動后4秒后,才啟用偏向鎖,考慮到程序運行時間較短,故做此設置,盡早啟用偏向鎖。
若禁用偏向鎖,則只需使用如下參數啟動程序:
-XX:-UseBiasedLocking -client -Xmx512m -Xms512m
結果如下:
363
當對象處于輕量級鎖時,其中Mark Word
如下(00表示最后2位的值):
[ptr | 00] locked
此時,它指向存放在獲得鎖的線程棧中的該對象的真實對象頭。
當對象處于輕量級鎖時,其中Mark Word
如下:
[ptr | 10] monitor
此時,最后2位為10,整個 Mark Word
指向 Minitor
的指針。
當對象處理于普通的未鎖定狀態時,其格式如下:
[header | 0 | 01|] unlocked
前29位表示對象的哈希值、年齡等信息。倒數第3位為0,最后兩位為01,表示未鎖定。可以發現,最后兩位的值和偏向狀態是一樣的,此時虛擬機通過倒數第3位來區分是否為偏向鎖。
上述內容就是如何理解java中鎖與并發,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。