執行緒之安全發布物件 單例模式

2021-08-20 17:08:42 字數 4435 閱讀 1914

單例模式:保證獲取到的物件是同乙個物件,物件只例項化一次

特點:單例類的構造方法是private

有乙個靜態方法getinstance獲取單例例項

兩大類:懶漢式與餓漢式

懶漢:在需要單例物件時,手動呼叫getinstance方法時,才會執行第一次建立

餓漢:預設就建立好乙個單例物件,不需要手動呼叫才建立

/**

* 懶漢模式----在工廠方法中例項化

* 單例例項在第一次使用時進行建立

*/@slf4j

@notrecommend

@notthreadsafe

public class singletonexample1

private static singletonexample1 instance=null;

public static singletonexample1 getinstance()

}

使用synchronized關鍵字修飾getinstance方法,保證每次只能乙個執行緒呼叫該方法,保證了執行緒安全

但是,不推薦,效率比較低,因為單例只例項化一次,也就是說99.999999%的情況下,getinstance返回的是已經初始化的同乙個物件

/**

* 懶漢模式

* 單例例項在第一次使用時進行建立

*/@slf4j

@threadsafe

@notrecommend

public class singletonexample3

private static singletonexample3 instance=null;

// 使用synchronized修飾,同一時間只能有乙個執行緒進入這個方法,

// 是執行緒安全的,但是會導致效率低下

public static synchronized singletonexample3 getinstance()

}

/**

* 懶漢模式

* 單例例項在第一次使用時進行建立

* 雙重檢測機制:執行緒安全問題?如何限制指令重排呢?

*/@slf4j

@notthreadsafe

public class singletonexample4

// 1, memory=allocate()分配物件的記憶體空間

// 2,ctorinstance()初始化物件

// 3,instance=memory 設定instance指向剛分配的記憶體

// jvm和cpu優化,發生指令重排

// 1, memory=allocate()分配物件的記憶體空間

// 3,instance=memory 設定instance指向剛分配的記憶體

// 2,ctorinstance()初始化物件

private static singletonexample4 instance=null;

public static singletonexample4 getinstance()}}

return instance;

}}

效能較高

/**

* 懶漢模式

* 單例例項在第一次使用時進行建立

* 雙重檢測機制:執行緒安全問題?如何限制指令重排呢? 使用volatile+雙重檢測機制

*/@slf4j

@threadsafe

public class singletonexample5

// 1, memory=allocate()分配物件的記憶體空間

// 2,ctorinstance()初始化物件

// 3,instance=memory 設定instance指向剛分配的記憶體

//單例物件 volatile+雙重檢測機制-》禁止指令重排

// 被volatile關鍵字修飾的物件或者變數,對其讀寫的操作時直接在主存中執行的,也就是

//獲取最新的值,新的值也能立刻更新到主存中

private static volatile singletonexample5 instance=null;

public static singletonexample5 getinstance()中

if(null==instance)}}

return instance;

}}

餓漢模式**示例

/**

* 餓漢模式

* 單例例項在類裝載使用時進行建立

* 要求:該單例物件一定會被使用,以免造成資源浪費

*/@slf4j

@threadsafe

public class singletonexample2

private static singletonexample2 instance=new singletonexample2();

public static singletonexample2 getinstance()

}

**

* 餓漢模式--使用靜態塊例項化

* 單例例項在類裝載使用時進行建立

* 要求:該單例物件一定會被被使用,以免造成資源浪費

* 初始化順序:這個順序不必記憶,具體可打斷點觀察順序

*/@slf4j

@threadsafe

public class singletonexample6

// static

private static singletonexample6 instance=null;

static

public static singletonexample6 getinstance()

public static void main(string args)

}

使用列舉來完成單例的例項化,推薦,這是由jvm保證的

/**

* 餓漢模式--使用列舉例項化,最安全

* 單例例項在類裝載使用時進行建立

* 要求:該單例物件一定會被被使用,以免造成資源浪費

*/@slf4j

@threadsafe

@recommend

public class singletonexample7

private static singletonexample7 instance=null;

public static singletonexample7 getinstance()

//列舉是特殊的類,這裡將其看成是乙個內部類即可

private enum singleton

public singletonexample7 getsingleton()

}public static void main(string args)

}

@threadsafe

@notthreadsafe

@recommend

@notrecommend

是自定義註解,只是用來方便標識類(方法)是否執行緒安全,是否推薦等資訊

註解類**如下:

/**

* 標識不推薦的寫法

*/@target(elementtype.type)

@retention(retentionpolicy.source)

public @inte***ce notrecommend

/**

* 用來標記執行緒【不安全】的類或者方法

*/@target(elementtype.type)

//註解範圍

@retention(retentionpolicy.source)

public @inte***ce notthreadsafe

/**

* 標識推薦的寫法

*/@target(elementtype.type)

@retention(retentionpolicy.source)

public @inte***ce recommend

/**

* 用來標記執行緒安全的類或者方法

*/@target(elementtype.type)

//註解範圍

@retention(retentionpolicy.source)

public @inte***ce threadsafe

多執行緒 三 安全發布物件和單例模式舉例

發布物件 使乙個物件能夠被當前範圍之外的 所使用 物件逸出 一種錯誤的發布.當乙個物件還沒有構造完成時,就使它被其它執行緒所見.安全發布物件4種方法 1.在靜態初始化函式中初始化乙個物件引用.2.將物件的引用儲存到volatile型別域或者atomicreference物件中.3.將物件的引用儲存到...

c 多執行緒單例模式 執行緒安全C 單例模式

我對此處記錄的單例模式有一些疑問 http us library ff650316.aspx 以下 摘自該文章 using system public sealed class singleton private static volatile singleton instance private ...

設計模式 單例模式(執行緒安全)

前言 單例模式是設計模式中比較簡單的一種,但是又因為簡單常見在面試中又是經常出現的乙個設計模式。所以必須要會啊。之前也只是會寫執行緒不安全的單例模式。單例模式 乙個類能返回物件乙個引用 永遠是同乙個 和乙個獲得該例項的方法 必須是靜態方法,通常使用getinstance這個名稱 當我們呼叫這個方法時...