偏向鎖

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);
		

	}

}

 

發佈了472 篇原創文章 · 獲贊 224 · 訪問量 52萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章