標籤:java虛擬機器 jvm 多線程 鎖 並發
概述
偏向鎖是JDK 1.6提出的一種鎖最佳化方式,起核心思想是如果程式沒有競爭,則取消之前已經取得鎖的線程的同步操作。也就是說,某一個鎖被一個線程擷取之後,便進入了偏向鎖模式,當該線程再次請求這個鎖時,就無需再進行相關的同步操作,從而節省了操作時間。但是如果在此期間,有其他線程申請了這個鎖,則退出偏向鎖模式。在JVM中可以使用-XX:+UseBiasedLocking設定啟用偏向鎖。
實驗
看如下的代碼:
package com.winwill.lock;import java.util.List;import java.util.Vector;/** * @author qifuguang * @date 15/6/5 13:44 */public class TestBiasedLock { private static List<Integer> list = new Vector<Integer>(); public static void main(String[] args) { long tsStart = System.currentTimeMillis(); for (int i = 0; i < 10000000; i++) { list.add(i); } System.out.println("一共耗費:" + (System.currentTimeMillis() - tsStart) + " ms"); }}
代碼中使用一個迴圈一直往Vector中新增元素,Vector的add操作會請求鎖:
/** * Appends the specified element to the end of this Vector. * * @param e element to be appended to this Vector * @return {@code true} (as specified by {@link Collection#add}) * @since 1.2 */ public synchronized boolean add(E e) { modCount++; ensureCapacityHelper(elementCount + 1); elementData[elementCount++] = e; return true; }
我們使用如下的參數運行代碼:
-XX:+UseBiasedLocking
-XX:BiasedLockingStartupDelay=0
-Xmx512m
-Xms512m
-XX:BiasedLockingStartupDelay=0這個參數表示虛擬機器一啟動就啟動偏向鎖模式,因為預設情況下,虛擬機器啟動4s之後才會啟動偏向鎖模式,該例已耗用時間較短,故做此設定。
得到如下結果:
但是,如果我們使用如下的參數運行程式:
-XX:-UseBiasedLocking
-Xmx512m
-Xms512m
得到的結果如下:
結論
偏向鎖在少競爭的情況下,對系統效能有一定的協助。
注意事項
偏向鎖在競爭激烈的情況下沒有太強的最佳化效果,因為大量的競爭會導致持有鎖的線程不停地切換,鎖也很難一直保持偏向模式,此時,使用偏向鎖不僅不能最佳化程式,反而有可能降低程式效能。因為,在競爭激烈的情境下可以使用-XX:-UseBiasedLocking參數禁用偏向鎖。
Java偏向鎖