biased:
adj. | 有偏見的; 傾向性的; 片面的; 偏重; 偏向; |
v. | 使有偏見; 使偏心; 使偏向; |
偏向鎖,JDK1.6提出,核心思想爲:如果程序沒有競爭,則取消之前已經獲取鎖的線程同步操作。即,若某一鎖被線程獲取後,便進入偏向模式,當線程再次請求這個鎖時,無需再進行相關的同步操作,從而節省了操作時間,如果在此之間有其他線程進行了鎖請求,則鎖退出偏向模式。
偏向鎖在鎖競爭激烈的場合沒有太強的優化效果,因爲大量的競爭會導致持有鎖的線程不停地切換,鎖很難一直保持在偏向的模式。在競爭激烈的場合,嘗試禁用偏向鎖,如-XX:-UseBiasedLocking參數
JVM使用:-XX:+UseBiasedLocking可以設置啓動偏向鎖。
-XX:+UseBiasedLocking -XX:BiasedLockingStartupDelay=0 -client -Xmx512m -Xms512m
-XX:BiasedLockingStartupDelay=0表示虛擬機啓動後,立即啓動偏向鎖。如不設置,虛擬機默認啓動後4秒後,才啓用偏向鎖。
當鎖處於偏向模式時,對象頭會記錄獲得鎖的線程。
[JavaThread *|epoch|age|1|01]
23位持有偏向鎖的線程,epoch 2位偏向鎖的時間戳,age 4位表示對象年齡 1表示偏向鎖,01表示看偏向/未鎖定
偏向鎖會偏向於第一個獲得它的線程,如果在接下來的執行過程中,該鎖沒有被其他的線程獲取,則持有偏向鎖的線程將永遠不需要同步。大多數情況下,鎖不僅不存在多線程競爭,而且總是由同一線程多次獲得,爲了讓線程獲得鎖的代價更低而引入了偏向鎖。
由於Vector的訪問,都是同步鎖控制,故每次操作都會請求numberList對象的鎖。使用
-XX:+UseBiasedLocking -XX:BiasedLockingStartupDelay=0 -client -Xmx512m -Xms512m
運行爲:203
如果不加偏向鎖,則時間爲:2497
package com.lock;
import java.util.List;
import java.util.Vector;
public class Biased {
public static List<Integer> numberList=new Vector<Integer>();
public static void main(String[] args) {
long begin=System.currentTimeMillis();
int count=0;
int startnum=0;
while(count<10000000){
numberList.add(startnum);
startnum+=2;
count++;
}
long end=System.currentTimeMillis();
System.out.println(end-begin);
}
}