亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

JVM筆記-13

cyixlq / 638人閱讀

摘要:不可變?nèi)缃^對(duì)線程安全就是滿足并發(fā)編程實(shí)戰(zhàn)中對(duì)線程安全的定義在中標(biāo)注自己是線程安全的類,大都不是絕對(duì)的線程安全。如的和二實(shí)現(xiàn)線程安全的方法互斥同步互斥是因同步是果互斥是方法同步是目的。

一.到底什么叫線程安全:
java并發(fā)編程實(shí)戰(zhàn)中對(duì)線程安全的定義是:當(dāng)多個(gè)線程訪問(wèn)一個(gè)對(duì)象時(shí),如果不用考慮這些線程在運(yùn)行時(shí)環(huán)境下的調(diào)度和交替執(zhí)行,也不需要進(jìn)行額外的同步,或者在調(diào)用方進(jìn)行任何其他的協(xié)調(diào)操作,調(diào)用這個(gè)對(duì)象的行為都可以獲得正確的結(jié)果,那這個(gè)對(duì)象是線程安全的”。這個(gè)定義比較嚴(yán)格,一般我們都會(huì)將其弱化。
按照線程安全的“安全程度”由強(qiáng)至弱來(lái)排序,我們可以將Java語(yǔ)言中各種操作共享的數(shù)據(jù)分為以下5類:不可變、絕對(duì)線程安全、相對(duì)線程安全、線程兼容和線程對(duì)立。
1.不可變:如String
2.絕對(duì)線程安全就是滿足java并發(fā)編程實(shí)戰(zhàn)中對(duì)線程安全的定義
在javaAPI中標(biāo)注自己是線程安全的類,大都不是絕對(duì)的線程安全。如Vector,它的add,get,size方法都加了synchronized修飾的,但請(qǐng)看下面一段代碼:

private static Vector vector = new Vector();  
  
  
    public static void main(String[] args) {  
        while (true) {  
            for (int i = 0; i < 10; i++) {  
                vector.add(i);  
            }  
  
  
            Thread removeThread = new Thread(new Runnable() {  
                @Override  
                public void run() {  
                    for (int i = 0; i < vector.size(); i++) {  
                        vector.remove(i);  
                    }  
                }  
            });  
  
  
            Thread printThread = new Thread(new Runnable() {  
                @Override  
                public void run() {  
                    for (int i = 0; i < vector.size(); i++) {  
                        System.out.println((vector.get(i)));  
                    }  
                }  
            });  
  
  
            removeThread.start();  
            printThread.start();  
  
  
            //不要同時(shí)產(chǎn)生過(guò)多的線程,否則會(huì)導(dǎo)致操作系統(tǒng)假死  
            while (Thread.activeCount() > 20);  
        }  
    }  

這段代碼有可能產(chǎn)生問(wèn)題,因?yàn)槿绻趐rintThread剛好要打印最后一個(gè)元素時(shí)removeThread恰好刪除了一個(gè)元素,則printThread就會(huì)產(chǎn)生ArrayIndexOutOfBoundsException

3.相對(duì)線程安全
相對(duì)的線程安全就是我們通常意義上所講的線程安全,它需要保證對(duì)這個(gè)對(duì)象多帶帶的操作是線程安全的,我們?cè)谡{(diào)用的時(shí)候不需要做額外的保障措施,但是對(duì)于一些特定順序的連續(xù)調(diào)用,就可能需要在調(diào)用端使用額外的同步手段來(lái)保證調(diào)用的正確性。如上面的Vector容器就是相對(duì)線程安全

4.線程兼容
線程兼容是指對(duì)象本身并不是線程安全的,但是可以通過(guò)在調(diào)用端正確地使用同步手段來(lái)保證對(duì)象在并發(fā)環(huán)境中可以安全地使用,我們平常說(shuō)一個(gè)類不是線程安全的,絕大多數(shù)時(shí)候指的是這一種情況

5.線程對(duì)立
指的是指無(wú)論調(diào)用端是否采取了同步措施,都無(wú)法在多線程環(huán)境中并發(fā)使用的代碼。如Thread的suspend()和resume()

二.實(shí)現(xiàn)線程安全的方法
1.互斥同步
互斥是因,同步是果;互斥是方法,同步是目的。
在Java中,最基本的互斥同步手段就是synchronized關(guān)鍵字,synchronized關(guān)鍵字經(jīng)過(guò)編譯之后,會(huì)在同步塊的前后分別形成monitorenter和monitorexit這兩個(gè)字節(jié)碼指令,這兩個(gè)字節(jié)碼都需要一個(gè)reference類型的參數(shù)來(lái)指明要鎖定和解鎖的對(duì)象。
synchronized同步塊對(duì)同一條線程來(lái)說(shuō)是可重入的,不會(huì)出現(xiàn)自己把自己鎖死的問(wèn)題。

2.非阻塞同步
互斥同步也叫阻塞同步。阻塞同步屬于一種悲觀的并發(fā)策略,在有可能出現(xiàn)并發(fā)問(wèn)題的地方都要進(jìn)行同步措施(如加鎖)。非阻塞同步采用樂(lè)觀的并發(fā)策略,通過(guò)沖突檢測(cè)檢查是否有競(jìng)爭(zhēng),有的進(jìn)行補(bǔ)償措施(如不斷重試直到成功),因?yàn)樗挥冒丫€程掛起所以是非阻塞的??墒沁@就好了嗎,要知道我們肯定要保證沖突檢測(cè)和操作這兩個(gè)操作的原子性啊,那怎么保證呢,肯定不能用互斥同步(這樣的話還是變成會(huì)阻塞的),答案是必須要有硬件指令集的支持來(lái)保證原子性。
這類常用指令有:
測(cè)試并設(shè)置(Test-and-Set)。
獲取并增加(Fetch-and-Increment)。
交換(Swap)。
比較并交換(Compare-and-Swap,下文稱CAS)。
加載鏈接/條件存儲(chǔ)(Load-Linked/Store-Conditional,下文稱LL/SC)。

Java中的CAS操作由sun.misc.Unsafe類里面的compareAndSwapInt()和compareAndSwapLong()等幾個(gè)方法包裝提供,虛擬機(jī)在內(nèi)部對(duì)這些方法做了特殊處理,即時(shí)編譯出來(lái)的結(jié)果就是一條平臺(tái)相關(guān)的處理器CAS指令,沒(méi)有方法調(diào)用的過(guò)程,或者可以認(rèn)為是無(wú)條件內(nèi)聯(lián)進(jìn)去了。
由于Unsafe類不是提供給用戶程序調(diào)用的類(Unsafe.getUnsafe()的代碼中限制了只有啟動(dòng)類加載器(Bootstrap ClassLoader)加載的Class才能訪問(wèn)它),因此,如果不采用反射手段,我們只能通過(guò)其他的JavaAPI來(lái)間接使用它,如J.U.C包里面的整數(shù)原子類,其中的compareAndSet()和getAndIncrement()等方法都使用了Unsafe類的CAS操作。

無(wú)同步方案
有些代碼不涉及共享數(shù)據(jù),當(dāng)然就不需要同步了。

三.鎖優(yōu)化
1.自旋鎖與自適應(yīng)自旋
自旋就是獲取鎖失敗的時(shí)候讓線程忙循環(huán),而不是阻塞,這可以提高響應(yīng)速度以及避免線程切換的開(kāi)銷,但浪費(fèi)CPU時(shí)間。
自適應(yīng)自旋就是如果循環(huán)獲取一定次數(shù)還沒(méi)獲取成功,就阻塞。
自旋鎖在JDK中默認(rèn)關(guān)閉,可使用用-XX:+UseSpinning開(kāi)啟

2.鎖消除
鎖消除是指虛擬機(jī)即時(shí)編譯器在運(yùn)行時(shí),對(duì)一些代碼上要求同步,但是被檢測(cè)到不可能存在共享數(shù)據(jù)競(jìng)爭(zhēng)的鎖進(jìn)行消除。鎖消除的主要判定依據(jù)來(lái)源于逃逸分析的數(shù)據(jù)支持,如果判斷在一段代碼中,堆上的所有數(shù)據(jù)都不會(huì)逃逸出去從章已經(jīng)講解過(guò)逃逸分析技術(shù)),如果判斷在一段代碼中,堆上的所有數(shù)據(jù)都不會(huì)逃逸出去從而被其他線程訪問(wèn)到,那就可以把它們當(dāng)做棧上數(shù)據(jù)對(duì)待,認(rèn)為它們是線程私有的,同步加鎖自然就無(wú)須進(jìn)行。
3.鎖粗化
防止過(guò)于頻繁的加鎖解鎖操作

4.輕量級(jí)鎖

在代碼進(jìn)入同步塊的時(shí)候,如果此同步對(duì)象沒(méi)有被鎖定(鎖標(biāo)志位為“01”狀態(tài)),虛擬機(jī)首先將在當(dāng)前線程的棧幀中建立一個(gè)名為鎖記錄(Lock Record)的空間,用于存儲(chǔ)鎖對(duì)象目前的Mark Word的拷貝(官方叫Displaced Mark Word)。

5.偏向鎖
偏向鎖優(yōu)化點(diǎn)加解鎖在于連CAS操作都不用了

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/67907.html

相關(guān)文章

  • 《深入理解JVM虛擬機(jī)》讀書(shū)筆記-開(kāi)篇

    摘要:年開(kāi)始工作,年畢業(yè),兩年來(lái)的工作接觸知識(shí)面很廣,用的東西比較多,包括基礎(chǔ)的開(kāi)發(fā)到開(kāi)發(fā)到大數(shù)據(jù),推薦系統(tǒng),到服務(wù)器運(yùn)維,到數(shù)據(jù)庫(kù)維護(hù),,,可愈發(fā)明白貪多嚼不爛的道理,唯有才能踏踏實(shí)實(shí),趁著剛剛讀完這本書(shū),想復(fù)習(xí),順便寫(xiě)一些筆記,聊以鞏固。 13年開(kāi)始工作,14年畢業(yè),兩年來(lái)的工作接觸知識(shí)面很廣,用的東西比較多,包括基礎(chǔ)的java開(kāi)發(fā)到j(luò)2ee,web開(kāi)發(fā),到大數(shù)據(jù),推薦系統(tǒng),到服務(wù)器運(yùn)維...

    legendaryedu 評(píng)論0 收藏0
  • 13張圖解就能讓女朋友徹底了解Java中的內(nèi)存模型,快上車!

    摘要:前言了解中的對(duì)象變量等存放的內(nèi)存區(qū)域十分重要本文將全面講解虛擬機(jī)中的內(nèi)存模型分區(qū),希望你們會(huì)喜歡目錄張圖解就能讓女朋友徹底了解中的內(nèi)存模型,快上車虛擬機(jī) 前言了解Java中的對(duì)象、變量等存放的內(nèi)存區(qū)域十分重要本文將全面講解Java虛擬機(jī)中的內(nèi)存模型 & 分區(qū),希望你們會(huì)喜歡目錄1、內(nèi)存模型 & 分區(qū)Java虛擬機(jī)在運(yùn)行Ja...

    番茄西紅柿 評(píng)論0 收藏2637
  • Java學(xué)習(xí)路線總結(jié),搬磚工逆襲Java架構(gòu)師(全網(wǎng)最強(qiáng))

    摘要:哪吒社區(qū)技能樹(shù)打卡打卡貼函數(shù)式接口簡(jiǎn)介領(lǐng)域優(yōu)質(zhì)創(chuàng)作者哪吒公眾號(hào)作者架構(gòu)師奮斗者掃描主頁(yè)左側(cè)二維碼,加入群聊,一起學(xué)習(xí)一起進(jìn)步歡迎點(diǎn)贊收藏留言前情提要無(wú)意間聽(tīng)到領(lǐng)導(dǎo)們的談話,現(xiàn)在公司的現(xiàn)狀是碼農(nóng)太多,但能獨(dú)立帶隊(duì)的人太少,簡(jiǎn)而言之,不缺干 ? 哪吒社區(qū)Java技能樹(shù)打卡?【打卡貼 day2...

    Scorpion 評(píng)論0 收藏0
  • 那些年我看過(guò)的書(shū) —— 致敬我的大學(xué)生活 —— Say Good Bye !

    摘要:開(kāi)頭正式開(kāi)啟我入職的里程,現(xiàn)在已是工作了一個(gè)星期了,這個(gè)星期算是我入職的過(guò)渡期,算是知道了學(xué)校生活和工作的差距了,總之,盡快習(xí)慣這種生活吧。當(dāng)時(shí)是看的廖雪峰的博客自己也用做爬蟲(chóng)寫(xiě)過(guò)幾篇博客,不過(guò)有些是在前人的基礎(chǔ)上寫(xiě)的。 showImg(https://segmentfault.com/img/remote/1460000010867984); 開(kāi)頭 2017.08.21 正式開(kāi)啟我...

    xiaoqibTn 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<