程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java線程並發中罕見的鎖機制具體引見

Java線程並發中罕見的鎖機制具體引見

編輯:關於JAVA

Java線程並發中罕見的鎖機制具體引見。本站提示廣大學習愛好者:(Java線程並發中罕見的鎖機制具體引見)文章只能為提供參考,不一定能成為您想要的結果。以下是Java線程並發中罕見的鎖機制具體引見正文


跟著互聯網的蓬勃成長,愈來愈多的互聯網企業面對著用戶量收縮而帶來的並發平安成績。本文側重引見了在java並發中罕見的幾種鎖機制。

1.傾向鎖

傾向鎖是JDK1.6提出來的一種鎖優化的機制。其焦點的思惟是,假如法式沒有競爭,則撤消之前曾經獲得鎖的線程同步操作。也就是說,若某一鎖被線程獲得後,便進入傾向形式,當線程再次要求這個鎖時,就無需再停止相干的同步操作了,從而勤儉了操作時光,假如在此之間有其他的線程停止了鎖要求,則鎖加入傾向形式。在JVM中應用-XX:+UseBiasedLocking

package jvmProject;
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);
  }
}

初始化一個Vector,往外面添加10000000個Integer對象,然後輸入時光差。以此來測試傾向鎖的機能。至於為何要應用Vector而不應用ArrayList呢?

由於ArrayList是線程不平安的,Vector是線程平安的。如許說能夠還不敷詳細,可以翻看一下源碼吧。

Vector中的簡直一切操作是帶有sychronized的,而ArrayList是沒有的,所以Vector是線程平安的。

接上去我們來測試一下,開啟傾向鎖和不開啟傾向鎖對法式機能的影響有多年夜。

設置裝備擺設JVM啟動(開啟傾向鎖)參數為:

設置裝備擺設JVM啟動(封閉傾向鎖)參數為:

Perfect!開啟傾向鎖的法式運轉時光顯著較短,開啟傾向鎖比不開啟傾向鎖,在單個線程中操作一個對象的同步辦法,是有必定的優勢的。其實也能夠如許懂得,當只要一個線程操作帶有同步辦法的Vector對象的時刻,此時對Vector的操作就改變成了對ArrayList的操作。

傾向鎖在鎖競爭劇烈的場所沒有太強的優化後果,由於年夜量的競爭會招致持有鎖的線程一直地切換,鎖也很難堅持在傾向形式,此時,應用傾向鎖不只得不到機能的優化,反而有能夠下降體系的機能,是以,在劇烈競爭的場所,可以測驗考試應用

-XX:-UseBiastedLocking參數禁用傾向鎖。

2.輕量級鎖

假如傾向鎖掉敗,Java虛擬機就會讓線程請求輕量級鎖,輕量級鎖在虛擬機外部,應用一個成為BasicObjectLock的對象完成的,這個對象外部由一個BasicLock對象和一個持有該鎖的Java對象指針構成。BasicObjectLock對象放置在Java棧幀中。在BasicLock對象外部還保護著displaced_header字段,用於備份對象頭部的Mark Word.

當一個線程持有一個對象的鎖的時刻,對象頭部Mark Word信息以下

[ptr |00] locked

末尾的兩位比特為00,全部Mark Word為指向BasicLock對象的指針。因為BasicObjectLock對象在線程棧中,是以該指針必定指向持有該鎖的線程棧空間。當須要斷定一個線程能否持有該對象時,只須要簡略地斷定對象頭的指針能否在以後線程的棧地址規模便可。同時,BasicLock對象的displaced_header,備份了原對象的Mark word內容,BasicObjectLock對象的obj字段則指向持有鎖的對象頭部。

3.分量級鎖

當輕量級鎖掉敗,虛擬機就會應用分量級鎖。在應用分量級鎖的時,對象的Mark Word以下:

[ptr |10] monitor

分量級鎖在操作進程中,線程能夠會被操作體系層面掛起,假如是如許,線程間的切換和挪用本錢就會年夜年夜進步。

4.自旋鎖

自旋鎖可使線程在沒有獲得鎖的時刻,不被掛起,而轉去履行一個空輪回,(即所謂的自旋,就是本身履行空輪回),若在若干個空輪回後,線程假如可以取得鎖,則持續履行。若線程仍然不克不及取得鎖,才會被掛起。

應用自旋鎖後,線程被掛起的概率絕對削減,線程履行的連接性絕對增強。是以,關於那些鎖競爭不是很劇烈,鎖占用時光很短的並發線程,具有必定的積極意義,但關於鎖競爭劇烈,單線程鎖占用很長時光的並發法式,自旋鎖在自旋期待後,常常決然沒法取得對應的鎖,不只僅白白糟蹋了CPU時光,終究照樣免不了被掛起的操作 ,反而糟蹋了體系的資本。

在JDK1.6中,Java虛擬機供給-XX:+UseSpinning參數來開啟自旋鎖,應用-XX:PreBlockSpin參數來設置自旋鎖期待的次數。

在JDK1.7開端,自旋鎖的參數被撤消,虛擬機不再支撐由用戶設置裝備擺設自旋鎖,自旋鎖老是會履行,自旋鎖次數也由虛擬機主動調劑。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved