国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

java的線程、鎖相關

xavier / 995人閱讀

摘要:那豈不是線程安全的對于普通同步方法,鎖是當前實例對象。如果測試成功,表示線程已經獲得了鎖。然后線程嘗試使用將對象頭中的替換為指向鎖記錄的指針。

volatitle
這樣的一行代碼:

volatitle instance = new Singleton(); // instance是volatile變量

匯編后代碼是這樣子的

0x01a3de1d: movb $0×0,0×1104800(%esi);0x01a3de24: lock addl $0×0,(%esp);

當中有個lock指令,這個指令是做什么的呢?
1)將當前處理器緩存行的數據寫回到系統內存。
2)這個寫回內存的操作會使在其他CPU里緩存了該內存地址的數據無效。

處理器不會直接跟內存打交道,而是緩存。所以,首先會將值寫會內存,而后將該值的所有緩存設置為無效,包括多處理器環境下的緩存。(那豈不是線程安全的?)

synchronized
對于普通同步方法,鎖是當前實例對象。
對于靜態同步方法,鎖是當前類的Class對象。
對于同步方法塊,鎖是Synchonized括號里配置的對象。

由于鎖太重,為了提高syn會采取幾種輕量級鎖
1 偏向鎖
HotSpot的作者發現,鎖總是由同一個線程獲得,因此當線程獲得鎖的時候,會在對象頭和棧幀中的鎖記錄里存儲鎖偏向的線程ID,以后該線程在進入和退出同步塊時不需要進行CAS操作來加鎖和解鎖,只需簡單地測試一下對象頭的Mark Word里是否存儲著指向當前線程的偏向鎖。如果測試成功,表示線程已經獲得了鎖。

如果測試失敗,則需要再測試一下Mark Word中偏向鎖的標識是否設置成1(表示當前是偏向鎖):如果沒有設置,則使用CAS競爭鎖;如果設置了,則嘗試使用CAS將對象頭的偏向鎖指向當前線程

2 輕量級鎖
線程在執行同步塊之前,JVM會先在當前線程的棧楨中創建用于存儲鎖記錄的空間,并
將對象頭中的Mark Word復制到鎖記錄中,官方稱為Displaced Mark Word。然后線程嘗試使用CAS將對象頭中的Mark Word替換為指向鎖記錄的指針。如果成功,當前線程獲得鎖,如果失敗,表示其他線程競爭鎖,當前線程便嘗試使用自旋來獲取鎖

單例模式可能的問題
double check可能會存在問題

public class Singleton{
     private static Singleton instance = null;
     private Singleton(){}

     public static Singleton getInstance(){
            if(instance == null){
                   synchronized(Singleton.class){
                        if(instance == null)
                        instance = new Singleton();//問題
                   }           
             }
            return instance;
    }
}

在問題步驟中,對象的創建包含了三個環節
1 分配空間
2 棧指針指向空間
3 實例化對象

但由于jvm的指令重排序,可能1->3->2
那么如果一個線程執行完1->3 跳出了syn塊
那么第二個線程判斷實例非空,直接返回,但事實上并沒有初始化掉,因此存在問題

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69979.html

相關文章

  • 并發學習筆記(2)

    摘要:當其他線程調用時,它們被阻塞,直到第一個線程釋放鎖對象。包關于獲取這個鎖如果鎖同時被另一個線程擁有則發生阻塞。所以必須確保沒有其他線程再檢查余額和轉賬活動之間修改金額。方法添加一個線程到等待集中,方法解除等待線程的阻塞狀態。 避免代碼塊受到并發訪問的干擾 java語言提供了兩種機制實現這種功能 Synchonized 關鍵字(調用對象內部的鎖) synchronized關鍵字自動...

    saucxs 評論0 收藏0
  • java線程相關

    摘要:那豈不是線程安全的對于普通同步方法,鎖是當前實例對象。如果測試成功,表示線程已經獲得了鎖。然后線程嘗試使用將對象頭中的替換為指向鎖記錄的指針。 volatitle這樣的一行代碼: volatitle instance = new Singleton(); // instance是volatile變量 匯編后代碼是這樣子的 0x01a3de1d: movb $0×0,0×1104800...

    VPointer 評論0 收藏0
  • Java 重入 ReentrantLock 原理分析

    摘要:的主要功能和關鍵字一致,均是用于多線程的同步。而僅支持通過查詢當前線程是否持有鎖。由于和使用的是同一把可重入鎖,所以線程可以進入方法,并再次獲得鎖,而不會被阻塞住。公平與非公平公平與非公平指的是線程獲取鎖的方式。 1.簡介 可重入鎖ReentrantLock自 JDK 1.5 被引入,功能上與synchronized關鍵字類似。所謂的可重入是指,線程可對同一把鎖進行重復加鎖,而不會被阻...

    lx1036 評論0 收藏0
  • 淺談Java并發編程系列(七) —— 深入解析synchronized關鍵字

    摘要:第一個字被稱為。經量級鎖的加鎖過程當一個對象被鎖定時,被復制到當前嘗試獲取鎖的線程的線程棧的鎖記錄空間被復制的官方稱為。根據鎖對象目前是否處于被鎖定狀態,撤銷偏向后恢復到未鎖定或經量級鎖定狀態。 Synchronized關鍵字 synchronized的鎖機制的主要優勢是Java語言內置的鎖機制,因此,JVM可以自由的優化而不影響已存在的代碼。 任何對象都擁有對象頭這一數據結構來支持鎖...

    piglei 評論0 收藏0
  • 手撕面試官系列(七):面試必備之常問并發編程高級面試專題

    摘要:如何在線程池中提交線程內存模型相關問題什么是的內存模型,中各個線程是怎么彼此看到對方的變量的請談談有什么特點,為什么它能保證變量對所有線程的可見性既然能夠保證線程間的變量可見性,是不是就意味著基于變量的運算就是并發安全的請對比下對比的異同。 并發編程高級面試面試題 showImg(https://upload-images.jianshu.io/upload_images/133416...

    Charles 評論0 收藏0

發表評論

0條評論

xavier

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<