單例雙檢鎖線程不安全問題

2021-10-04 03:16:10 字數 866 閱讀 9739

單例雙檢鎖 執行緒不一定安全,

原因:多執行緒情形下,底層指令重排問題,需要加上volitile靜止指令重排

原因在於 某乙個執行緒執行到第一次檢測,讀取到instance 不為null 時,instance 的引用物件可能沒有完成初始化

單執行緒下指令重排保證序列語義執行一致性(指令重排無關緊要),多執行緒下指令重排,語義一致性就存在潛在的風險

instace =

newsingletondemo()

;//完成此行**需要以下三步 偽碼

memory =

allocate()

//1.分配記憶體空間

instance

(memory)

//2.初始化物件

instance = memory //3.設定instance 指向剛剛分配的空間,這時 instance != null

步驟 2,3 沒有資料依賴關係,所以由於指令重排,順序有可能變化。物件還沒有初始化

package com.myspringboot.test;

public

class

singletondemo

public

static singletondemo getinstance()

}}return instace;

}public

static

void

main

(string[

] args)

,string.

valueof

(i))

.start()

;}}}

執行緒(四)解決執行緒不安全問題

一 何為執行緒不安全?執行緒安全 多執行緒併發執行時,沒有產生邏輯錯誤 執行緒不安全 多執行緒併發執行時,產生邏輯錯誤 體會執行緒不安全 static class counter public static void main string args throws interruptedexcept...

序列化,多執行緒 執行緒搶占(執行緒不安全)問題

方案一 new object 需要實現序列化 map x 結果同乙個executor不同執行緒呼叫的object為同乙個 但是 多個executor 之間不是同乙個,object先在driver建立 然後序列化,然後在executor裡反序列化 方案二new class 需要實現序列化 map x ...

設計模式之單例模式(執行緒安全和執行緒不安全的)

1 單例模式 確保某乙個類只有乙個例項物件,並提供乙個全域性的訪問點。特點 1 只有乙個例項 2 自我例項化 3 提供全域性訪問點 優點 節約系統資源,提高系統效率,同時也能控制客戶對他的訪問,但是擴充套件起來比較困難。例項 1 餓漢模式 public class student 2 懶漢模式 pu...