摘要:那豈不是線程安全的對于普通同步方法,鎖是當前實例對象。如果測試成功,表示線程已經獲得了鎖。然后線程嘗試使用將對象頭中的替換為指向鎖記錄的指針。
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
摘要:那豈不是線程安全的對于普通同步方法,鎖是當前實例對象。如果測試成功,表示線程已經獲得了鎖。然后線程嘗試使用將對象頭中的替換為指向鎖記錄的指針。 volatitle這樣的一行代碼: volatitle instance = new Singleton(); // instance是volatile變量 匯編后代碼是這樣子的 0x01a3de1d: movb $0×0,0×1104800...
摘要:的主要功能和關鍵字一致,均是用于多線程的同步。而僅支持通過查詢當前線程是否持有鎖。由于和使用的是同一把可重入鎖,所以線程可以進入方法,并再次獲得鎖,而不會被阻塞住。公平與非公平公平與非公平指的是線程獲取鎖的方式。 1.簡介 可重入鎖ReentrantLock自 JDK 1.5 被引入,功能上與synchronized關鍵字類似。所謂的可重入是指,線程可對同一把鎖進行重復加鎖,而不會被阻...
摘要:第一個字被稱為。經量級鎖的加鎖過程當一個對象被鎖定時,被復制到當前嘗試獲取鎖的線程的線程棧的鎖記錄空間被復制的官方稱為。根據鎖對象目前是否處于被鎖定狀態,撤銷偏向后恢復到未鎖定或經量級鎖定狀態。 Synchronized關鍵字 synchronized的鎖機制的主要優勢是Java語言內置的鎖機制,因此,JVM可以自由的優化而不影響已存在的代碼。 任何對象都擁有對象頭這一數據結構來支持鎖...
摘要:如何在線程池中提交線程內存模型相關問題什么是的內存模型,中各個線程是怎么彼此看到對方的變量的請談談有什么特點,為什么它能保證變量對所有線程的可見性既然能夠保證線程間的變量可見性,是不是就意味著基于變量的運算就是并發安全的請對比下對比的異同。 并發編程高級面試面試題 showImg(https://upload-images.jianshu.io/upload_images/133416...
閱讀 2058·2021-11-11 16:54
閱讀 1039·2021-10-12 10:12
閱讀 377·2019-08-30 15:43
閱讀 646·2019-08-29 13:15
閱讀 1075·2019-08-29 13:12
閱讀 1524·2019-08-26 12:09
閱讀 1655·2019-08-26 10:24
閱讀 2251·2019-08-26 10:15