1. 雙鎖單例,為什麼要加 volatile?
volatile就牽扯到指令重排序的問題了。
要理解為什麼要加volatile,首先要理解new singleton()
做了什麼。new乙個物件有幾個步驟。1.看class物件是否載入,如果沒有就先載入class物件,2.分配記憶體空間,初始化例項,3.呼叫建構函式,4.返回位址給引用。而cpu為了優化程式,可能會進行指令重排序,打亂這3,4這幾個步驟,導致例項記憶體還沒分配,就被使用了。
再用執行緒a和執行緒b舉例。執行緒a執行到new singleton()
,開始初始化例項物件,由於存在指令重排序,這次new操作,先把引用賦值了,還沒有執行建構函式。這時時間片結束了,切換到執行緒b執行,執行緒b呼叫new singleton()
方法,發現引用不等於null
,就直接返回引用位址了,然後執行緒b執行了一些操作,就可能導致執行緒b使用了還沒有被初始化的變數。
加了volatile之後,就保證new
不會被指令重排序。
canvas知識體系
把canvas想象成乙個畫板 乙個繪製狀態,可模擬畫圖工具中的工具欄 繪圖元素,包括簡單的圖形,線條,複雜的組合,和 繪製模式,比如畫板中的圖形存在繪製的先後順序,而存在重疊部分,該如何顯示存在重疊的圖形,這是繪製模式要解決的問題 裁切路徑,只讓畫板的部分可見 畫素操作,操作imagedata的畫素...
Vue 知識體系
由vue官網可知,vue大致分為如下目錄 基礎在基礎中,簡單的介紹了vue在本地記事本方式開發的整個過程,學過該內容,可以通過記事本簡單的進行開發,但是僅限於單個頁面之間,且均為簡單的使用。過渡 動畫 在該單元中,詳細的講述了vue元件的動畫內容,當乙個 所有功能全部搞定之後,就該使用到該單元內容,...
OI 知識體系
oi training 知識體系結構 初級 1.1 c語言基礎 1.1.1 c語言程式結構 a b problem 1.1.2 變數,常量,資料型別,輸入與輸出 1.1.3 條件語句 1.1.4 迴圈語句 1.1.5 陣列 1.1.6 字元陣列 字串 1.1.7 指標 1.1.8 共同體 結構體 1...