一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語言 - JAVA教程 - Java線程并發(fā)中常見的鎖機(jī)制詳細(xì)介紹

Java線程并發(fā)中常見的鎖機(jī)制詳細(xì)介紹

2020-05-05 14:19路上有多遠(yuǎn) JAVA教程

越來越多的互聯(lián)網(wǎng)企業(yè)面臨著用戶量膨脹而帶來的并發(fā)安全問題。接下來通過本文給大家介紹Java線程并發(fā)中常見的鎖機(jī)制,感興趣的朋友一起看看吧

隨著互聯(lián)網(wǎng)的蓬勃發(fā)展,越來越多的互聯(lián)網(wǎng)企業(yè)面臨著用戶量膨脹而帶來的并發(fā)安全問題。本文著重介紹了在java并發(fā)中常見的幾種鎖機(jī)制。

1.偏向鎖

偏向鎖是JDK1.6提出來的一種鎖優(yōu)化的機(jī)制。其核心的思想是,如果程序沒有競(jìng)爭(zhēng),則取消之前已經(jīng)取得鎖的線程同步操作。也就是說,若某一鎖被線程獲取后,便進(jìn)入偏向模式,當(dāng)線程再次請(qǐng)求這個(gè)鎖時(shí),就無需再進(jìn)行相關(guān)的同步操作了,從而節(jié)約了操作時(shí)間,如果在此之間有其他的線程進(jìn)行了鎖請(qǐng)求,則鎖退出偏向模式。在JVM中使用-XX:+UseBiasedLocking

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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);
  }
}

初始化一個(gè)Vector,往里面添加10000000個(gè)Integer對(duì)象,然后輸出時(shí)間差。以此來測(cè)試偏向鎖的性能。至于為什么要使用Vector而不使用ArrayList呢?

因?yàn)锳rrayList是線程不安全的,Vector是線程安全的。這樣說可能還不夠具體,可以翻看一下源碼吧。

Java線程并發(fā)中常見的鎖機(jī)制詳細(xì)介紹

Java線程并發(fā)中常見的鎖機(jī)制詳細(xì)介紹

Vector中的幾乎所有操作是帶有sychronized的,而ArrayList是沒有的,所以Vector是線程安全的。

接下來我們來測(cè)試一下,開啟偏向鎖和不開啟偏向鎖對(duì)程序性能的影響有多大。

配置JVM啟動(dòng)(開啟偏向鎖)參數(shù)為:

Java線程并發(fā)中常見的鎖機(jī)制詳細(xì)介紹

Java線程并發(fā)中常見的鎖機(jī)制詳細(xì)介紹

配置JVM啟動(dòng)(關(guān)閉偏向鎖)參數(shù)為:

Java線程并發(fā)中常見的鎖機(jī)制詳細(xì)介紹

Java線程并發(fā)中常見的鎖機(jī)制詳細(xì)介紹

Perfect!開啟偏向鎖的程序運(yùn)行時(shí)間明顯較短,開啟偏向鎖比不開啟偏向鎖,在單個(gè)線程中操作一個(gè)對(duì)象的同步方法,是有一定的優(yōu)勢(shì)的。其實(shí)也可以這樣理解,當(dāng)只有一個(gè)線程操作帶有同步方法的Vector對(duì)象的時(shí)候,此時(shí)對(duì)Vector的操作就轉(zhuǎn)變成了對(duì)ArrayList的操作。

偏向鎖在鎖競(jìng)爭(zhēng)激烈的場(chǎng)合沒有太強(qiáng)的優(yōu)化效果,因?yàn)榇罅康母?jìng)爭(zhēng)會(huì)導(dǎo)致持有鎖的線程不停地切換,鎖也很難保持在偏向模式,此時(shí),使用偏向鎖不僅得不到性能的優(yōu)化,反而有可能降低系統(tǒng)的性能,因此,在激烈競(jìng)爭(zhēng)的場(chǎng)合,可以嘗試使用

-XX:-UseBiastedLocking參數(shù)禁用偏向鎖。

2.輕量級(jí)鎖

如果偏向鎖失敗,Java虛擬機(jī)就會(huì)讓線程申請(qǐng)輕量級(jí)鎖,輕量級(jí)鎖在虛擬機(jī)內(nèi)部,使用一個(gè)成為BasicObjectLock的對(duì)象實(shí)現(xiàn)的,這個(gè)對(duì)象內(nèi)部由一個(gè)BasicLock對(duì)象和一個(gè)持有該鎖的Java對(duì)象指針組成。BasicObjectLock對(duì)象放置在Java棧幀中。在BasicLock對(duì)象內(nèi)部還維護(hù)著displaced_header字段,用于備份對(duì)象頭部的Mark Word.

當(dāng)一個(gè)線程持有一個(gè)對(duì)象的鎖的時(shí)候,對(duì)象頭部Mark Word信息如下

[ptr |00] locked

末尾的兩位比特為00,整個(gè)Mark Word為指向BasicLock對(duì)象的指針。由于BasicObjectLock對(duì)象在線程棧中,因此該指針必然指向持有該鎖的線程棧空間。當(dāng)需要判斷一個(gè)線程是否持有該對(duì)象時(shí),只需要簡(jiǎn)單地判斷對(duì)象頭的指針是否在當(dāng)前線程的棧地址范圍即可。同時(shí),BasicLock對(duì)象的displaced_header,備份了原對(duì)象的Mark word內(nèi)容,BasicObjectLock對(duì)象的obj字段則指向持有鎖的對(duì)象頭部。

3.重量級(jí)鎖

當(dāng)輕量級(jí)鎖失敗,虛擬機(jī)就會(huì)使用重量級(jí)鎖。在使用重量級(jí)鎖的時(shí),對(duì)象的Mark Word如下:

[ptr |10] monitor

重量級(jí)鎖在操作過程中,線程可能會(huì)被操作系統(tǒng)層面掛起,如果是這樣,線程間的切換和調(diào)用成本就會(huì)大大提高。

4.自旋鎖

自旋鎖可以使線程在沒有取得鎖的時(shí)候,不被掛起,而轉(zhuǎn)去執(zhí)行一個(gè)空循環(huán),(即所謂的自旋,就是自己執(zhí)行空循環(huán)),若在若干個(gè)空循環(huán)后,線程如果可以獲得鎖,則繼續(xù)執(zhí)行。若線程依然不能獲得鎖,才會(huì)被掛起。

使用自旋鎖后,線程被掛起的幾率相對(duì)減少,線程執(zhí)行的連貫性相對(duì)加強(qiáng)。因此,對(duì)于那些鎖競(jìng)爭(zhēng)不是很激烈,鎖占用時(shí)間很短的并發(fā)線程,具有一定的積極意義,但對(duì)于鎖競(jìng)爭(zhēng)激烈,單線程鎖占用很長(zhǎng)時(shí)間的并發(fā)程序,自旋鎖在自旋等待后,往往毅然無法獲得對(duì)應(yīng)的鎖,不僅僅白白浪費(fèi)了CPU時(shí)間,最終還是免不了被掛起的操作 ,反而浪費(fèi)了系統(tǒng)的資源。

在JDK1.6中,Java虛擬機(jī)提供-XX:+UseSpinning參數(shù)來開啟自旋鎖,使用-XX:PreBlockSpin參數(shù)來設(shè)置自旋鎖等待的次數(shù)。

在JDK1.7開始,自旋鎖的參數(shù)被取消,虛擬機(jī)不再支持由用戶配置自旋鎖,自旋鎖總是會(huì)執(zhí)行,自旋鎖次數(shù)也由虛擬機(jī)自動(dòng)調(diào)整。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产日产精品久久久久快鸭 | avtt一区 | 动漫美女被吸乳羞羞小说 | 精品性影院一区二区三区内射 | 好湿好紧太硬了我太爽了h 好湿好滑好硬好爽好深视频 | 亚洲 欧美 偷自乱 图片 | 四虎国产一区 | 国产精品99在线观看 | 国产精品美女福利视频免费专区 | 九九九九在线精品免费视频 | 欧美在线播放成人免费 | 插得好爽 | 青青青国产精品国产精品美女 | 午夜办公室在线观看高清电影 | 亚洲色图色| 国产精品一区二区久久不卡 | 好猛好紧好硬使劲好大刺激视频 | 亚洲国产欧美另类va在线观看 | 91麻豆精品激情在线观看最新 | 范冰冰性xxxxhd | 秋霞一级成人欧美理论 | 国产91精品久久久久久久 | 白丝美女用胸伺候主人 | 天美蜜桃精东乌鸦传媒 | 国产情侣偷国语对白 | 花唇肿胀无法合拢双性 | 精品综合久久久久久8888 | 国产欧美一区二区三区免费看 | 成年人视频在线免费观看 | 国产亚洲综合精品一区二区三区 | 免费在线视频成人 | 高清国产精品久久 | 日本www色视频成人免费 | 天堂伊人 | 91九色porny国产美女一区 | 高h喷水荡肉爽文np肉色文 | 国产精品美女久久久久网站 | 火影忍者小南裸羞羞漫画 | 亚洲AV精品一区二区三区不卡 | 欧美亚洲天堂网 | 97久久久亚洲综合久久88 |